`

JNI技术实践小结

阅读更多

JNI 技术实践小结

 

 

       昨天和一部zzz一起研究解决一个 java 调用第三方 dll 的问题,从零开始学习了 jni 技术的应用,现在总结如下。

       事情的起因是一部的一个项目需要用到一个爱国者提供的基于 U 盘的加密技术。对方提供了 U 盘和一个 dll 动态链接库 hiddenIO.dll 。在 U 盘的隐藏区域内可以储存 USB-Key 信息,通过这个 dll 里的两个方法可以使用 c/c++ 编写程序在 U 盘的隐藏区域读写信息,对方提供了示例代码。由于一部的项目是基于 SWT/RCP 技术的,所以需要在 java 程序中调用这两个方法。


       目前 java dll 交互的技术主要有 3 种: jni jawin jacob Jni Java Native Interface )是 sun 提供的 java 与系统中的原生方法交互的技术(在 windows\linux 系统中,实现 java native method 互调)。目前只能由 c/c++ 实现。后两个都是 sourceforge 上的开源项目,同时也都是基于 jni 技术的 windows 系统上的一个应用库。 Jacob Java-Com Bridge )提供了 java 程序调用 microsoft com 对象中的方法的能力。而除了 com 对象外, jawin Java/Win32 integration project )还可以 win32-dll 动态链接库中的方法。就功能而言: jni >> jawin>jacob ,其大致的结构如下图:

 

 

jni 技术体系功能结构图

 

就易用性而言,正好相反: jacob>jawin>>jni

Jvm 封装了各种操作系统实际的差异性的同时,提供了 jni 技术,使得开发者可以通过 java 程序(代码)调用到操作系统相关的技术实现的库函数,从而与其他技术和系统交互,使用其他技术实现的系统的功能;同时其他技术和系统也可以通过 jni 提供的相应原生接口开调用 java 应用系统内部实现的功能。

windows 系统上,一般可执行的应用程序都是基于 native PE 结构, windows 上的 jvm 也是基于 native 结构实现的。 Java 应用体系都是构建于 jvm 之上。

 

 

 

Windows 系统上的 java 体系

 

Jni 对于应用本身来说,可以看做一个代理模式。对于开发者来说,需要使用 c/c++ 来实现一个代理程序( jni 程序)来实际操作目标原生函数, java 程序中则是 jvm 通过加载并调用此 jni 程序来间接地调用目标原生函数。

 

 

Jni 调用过程示意图

 

Jni 程序开发的一般操作步骤如下:

1.   编写 java 中的调用类

2.用 javah 生成 c/c++ 原生函数的头文件

3. c/c++ 中调用需要的其他函数功能,实现原生函数 ( 原则上可以调用任何资源 )

4. 将项目依赖的所有原生库和资源加入到 java 项目的 java.library.path

5. 生成 java 程序

6. 发布 java 应用和 dll

 

 

Jni 程序开发示例:

1. eclipse 项目中新建一个 TestHello.java ,输入以下内容:

public class TestHello { 

  static {

     System.loadLibrary("TestHello");

  } 

  public static native void hello(String msg); 

  public static void main(String[] args) {    

     hello("Hello,Kimm!");    

  } 

}
 

编译生成 TestHello. class 文件。

2. 在命令行下使用 javah TestHello 命令,生成 TestHello.h 头文件(就是 jni 代理 stub 的接口)。

3. VC6 中新建一个项目 TestHello, 项目类型为 Win32 Dynamic-Link Library 。点击 OK

 

 

 

 

 

在弹出的窗口中选择 A simple DLL project ,点击 Finish

 

 

 

 

打开项目所在的文件目录,将步骤 2 中生成的 TestHello.h 文件复制到此目录。点击左边中间的 FileView ,切换到文件浏览模式。在 Header Files 上点击右键,选择 Add Files to Folder…

选择 TestHello.h 文件,点击 OK

 

 

 

打开 StdAfx.h 文件,再最后面添加:

#include <jni.h>

#include "TestHello.h"

 

 

 

打开 TestHello.cpp 文件,在最后面添加一段代码:

JNIEXPORT void JNICALL Java_TestHello_hello(JNIEnv * env, jclass obj, jstring jMsg){
    const char *strMsgPtr = env->GetStringUTFChars( jMsg , 0);  
       MessageBox( 0, strMsgPtr,"Message box from VC++ ", 0 );
       env->ReleaseStringUTFChars( jMsg, strMsgPtr); 
}
 

VC 的菜单上选择 Tools-Options… ,打开选项对话框。在 Directories 文件夹,添加上 jdk 所在文件夹下的 include include\win32 文件夹。

 

 

点击 VC 上的菜单项 Build-Build All ,生成 TestHello.dll

4. VC 项目 Debug 文件夹中的 TestHello.dll 复制到 TestHello.class 所在的文件夹下。

5. 在命令行下输入 java TestHello ,弹出 MessageBox 对话框。调用 win32 api 成功。

 

 

 

 

 

 


楼主写的不错,我安楼主写的走了一篇,对jni有了初步的了解,谢谢楼主。
我的用的VS 2005以下是我走的过程中,碰到的问题我解决的方法。希望对其他vs不熟的人有点帮助:
问题 1 : fatal error C1083: 无法打开包括文件L ..........  No such file or directory
解决:“项目--->属性---->配置属性---->C/C++---->常规---->附加包含目录”选项中有很多include下的库

问题 2: error C2664: “MessageBoxW”: 不能将参数 2 从“const char *”转换为“LPCWSTR”
解决:所说字符集问题,我的vs2003这样设: 项目属性-> 配制属性-> 常规-> 字符集-> 选:使用多字节字符集

问题 3:没有找到MSVCR80D.dll,因此这个应用程序未能启动。
找到你的工程的文件夹,如(myproject),找到其下的myproject\myproject\Debug\ myproject.rec,把它删掉(删掉整个Debug目录也可以),重新编译,搞定!
:lol:

分享到:
评论

相关推荐

    JNI技术实践小结.doc

    JNI技术实践小结.doc

    JNI DEMO:java jni技术 调用 c/c++ 的dll

    总结来说,这个"JNI DEMO"是一个完整的示例,展示了如何使用Java的JNI技术来调用C/C++编写的DLL。它包括了Java代码、JNI接口的实现、DLL的编译以及Java应用的运行。对于初学者,这是一个很好的实践教程,即使没有...

    JNI设计实践之路

    ### JNI设计实践之路 #### 一、前言 在当今软件开发领域,Java作为一种广泛应用的编程语言,其灵活性和跨平台特性受到了众多开发者的青睐。然而,在某些特定场景下,如高性能计算、底层硬件访问或是集成已有C/C++...

    JNI编程技术,很难找到的

    ### JNI编程技术详解 #### 一、概述 JNI(Java Native Interface)是一种允许Java代码和其他语言编写的代码进行交互的标准接口。通过JNI,Java应用程序可以调用C或C++等本地语言编写的代码,实现高性能计算或其他...

    Jni编程技术

    ### Jni编程技术知识点概述 #### 一、JNI的基本概念及应用场景 JNI(Java Native Interface)是一种标准,允许Java代码和其他语言(如C/C++)编写的代码进行交互。主要应用场景包括: - **复用已有C/C++代码**:...

    JniDemo_H246分析_DEMO_jni测试_

    总结来说,“JniDemo_H246分析_DEMO_jni测试”项目是一个学习和实践JNI技术的好例子,它涵盖了从基础的JNI接口设计到高级的H264视频编解码应用。通过这样的实践,开发者可以更好地理解和掌握JNI在Android开发中的...

    jni教程实例手把手

    2. **JNI_编程技术__网文整理(1).doc 和 JNI_编程技术__网文整理.doc**:这些文档可能包含从网络上收集的各种JNI编程技巧和最佳实践,包括但不限于JNI函数的声明、数据类型的映射、异常处理、多线程支持等内容。...

    JNI CHM文档以及JNI编程规范

    通过深入学习和实践这些文档,开发者不仅能理解JNI的工作原理,还能熟练地编写混合Java和本地代码的应用程序。同时,理解和遵守JNI编程规范能确保代码的可维护性和健壮性,避免潜在的问题,如内存泄漏、线程安全问题...

    JNI编程指南中文版

    3. **第十一至第十三章:JNI技术规范** – 提供了关于JNI使用的详细规范,适用于那些需要深入了解其内部机制的开发者。 #### 三、JNI的角色与工作原理 **系统环境**(Host Environment)是指本地操作系统环境,它...

    Android JNI开发Demo

    Android JNI(Java Native Interface)开发是将Java代码与C/C++原生代码集成的一种技术,它允许开发者在Android应用中...这是一个很好的学习和实践JNI技术的起点,对于提升Android应用的性能和功能扩展具有重要意义。

    android JNI学习三实例

    Android JNI(Java Native Interface)是Android平台上的一个关键特性,它允许Java代码和其他语言写的代码进行交互,通常用于提升性能、调用系统...实践中,我们需要结合具体的项目需求和性能要求,灵活运用JNI技术。

    AIDL和JNI使用的小例子

    总结一下,本示例提供的`testndk`项目是一个结合使用AIDL和JNI的实践案例,展示了如何在Android应用中进行跨进程通信并利用C/C++代码提升性能。通过阅读源码和配合博客文章,你可以深入理解这两种技术的工作原理和...

    Android Studio JNI 调用demo

    总结,"Android Studio JNI 调用demo"是一个实践教程,旨在帮助开发者学习如何在Android应用中使用JNI技术,实现Java与C/C++代码的交互,提升性能或者利用已有的C/C++库。通过这个示例,开发者可以掌握JNI的基本流程...

    安卓JNIdemo

    总结起来,"安卓JNIdemo"是一个学习和实践JNI技术的好起点,它展示了如何在Android应用中集成C/C++代码,以及如何通过JNI在Java和本地代码之间进行通信。通过深入理解和掌握JNI,开发者可以更灵活地利用Android平台...

    JNI资料合集

    总结,JNI是连接Java世界与本地代码的关键技术,理解和掌握JNI,可以极大地扩展Java应用程序的能力。通过阅读“JNI详解”和“Java本地接口(JNI)编程指南和规范2”,开发者可以获得丰富的知识和实践经验,提升解决...

    bitoperation_jni_AndroidJNI位操作_android_

    总结来说,“bitoperation_jni”示例旨在展示如何在Android的JNI层利用位操作进行高效的数据处理。理解和熟练运用这些技术对于提升Android应用的性能和功能至关重要。通过深入学习和实践,开发者可以更好地利用JNI和...

    jni调用

    总结,JNI是Java与本地代码交互的关键技术,它允许开发者充分利用Java的跨平台优势,同时结合C/C++的高效性能。通过理解和熟练掌握JNI,开发者能够解决特定场景下的技术挑战,提高应用程序的性能和功能。在实际应用...

    rk3288 apk通过jni控制gpio

    总结起来,这个项目展示了如何在Android设备上,特别是Rockchip RK3288平台,通过JNI技术控制GPIO实现硬件级别的功能。从驱动开发到JNI接口设计,再到Android应用的实现,每个环节都需要深入理解和实践经验。这样的...

Global site tag (gtag.js) - Google Analytics