较详细的JNI简介

  

在Java中,有时候我们不得不要去使用其他语言的代码,比如说:

  

1,你的应用需要访问系统的各个特性和设备,这些特性和设备通过java平台是无法访问的。

  

2,你已经有了大量的测试过和调试过的用另一种语言编写的代码,并且知道如何将其导出到所有的目标平台上。

  

3,通过基础测试,你已经发现所编写的Java代码比用其他语言编写的等价代码要慢得多。

  

Java平台有一个用于和本地C代码进行互操作的API,称为Java本地接口(JNI)。现在就开始学习JNI,先从这篇的一个最简单的例子,了解如何使用JNI调用本地方法。

  

  

<强> 1,在类中声明一个本地方法

        包com.tao.test;   公开课NativeTest {   公共静态原生空隙sayHello ();   }      

我们使用本地关键字,声明了一个本地方法,而且我们还将他声明为静态的。本地方法可以是静态的,也可以不声明为静态的。

  

<强> 2,编译。java文件,生成含有该本地方法的类的字节码

  

如果是在eclipse中,进入& lt;工程目录在陶\ bin \ com \ \测试,就可以找到eclipse自动为我们编译的. class文件。

  

如果不是,则进入进入NativeTest.java文件所在的目录,使用javac命令编译该java类,生成了NativeTest.class字节码。

  

<强> 3,使用javah命令编译. class字节码,生成包含原生方法声明的C/c++头文件

  

如果是在eclipse中,进入& lt;工程目录祝辞\ bin目录,然后使用下面的编译命令(如果不是eclipse,则根据上面编译生成的. class文件的位置来用javap编译)

  

<强> 1. javah  com.tao.test.NativeTest ,,//记住要使用类型的全限定名称,,

  

就会在本目录下,生成我们需要的C、c++头文件,,,com_tao_test_NativeTest.h (头文件的名字带包名,且用_分隔),里面内容如下:

     /*不编辑这个文件,这是机器生成的*/# include & lt; jni.h>/*头类com_tao_test_NativeTest */的ifndef _Included_com_tao_test_NativeTest   #定义_Included_com_tao_test_NativeTest   # ifdef __cplusplus   外来的“C”{   # endif/*   *类:com_tao_test_NativeTest   *方法:sayHello   *签名:()V   */JNIEXPORT空白JNICALL Java_com_tao_test_NativeTest_sayHello   (JNIEnv *, jobject);      # ifdef __cplusplus   }   # endif   # endif      

<强> 4,按照生成的C/c++头文件来写C/c++源文件,并编译为DLL动态链接库

  

我们之前得到了包含原生方法声明的C/c++头文件,现在我们按照这个头文件,编写我们的C、c++源文件,并编译为DLL动态链接库。

  

上一步,我们得到了com_tao_test_NativeTest.h头文件。

  

①,首先。新建一个Win32 DLL项目(我使用的是VS2005开发环境,VC6.0 + +是新建一个Win32动态链接库)

  

,,,新建——祝辞项目,在Visual c++——在Win32——在控制台应用程序,在输入项目名称,我使用为NativeCall

  

较详细的JNI简介

  

点击确定后,进入下面的界面

  

较详细的JNI简介

  

点击下一步,进入下一界面,勾选为DLL和空项目。

  

较详细的JNI简介

  

这样就建立了一个Win32 DLL项目了。

  

②,添加com_tao_test_NativeTest.h头文件

  

将com_tao_test_NativeTest.h头文件复制,黏贴到NativeCall/NativeCall目录下,如E: \ VCProject \ NativeCall \ NativeCall该文件夹。然后再VS2005中的项目中,添加该头文件

  

③,添加jni.h和

  

打开com_tao_test_NativeTest。h头文件,看第二行,调用了jni.h,这个头文件需要我们自己添加,为了JAVA_HOME/包括目录下,添加方式和第②步一样

     /*不编辑这个文件,这是机器生成的*/# include & lt; jni.h>/*头类com_tao_test_NativeTest */的ifndef _Included_com_tao_test_NativeTest   #定义_Included_com_tao_test_NativeTest      

然后把上面的第二行的# include & lt; jni.h>改为# include“jni.h”。让它去调用我们自己的头文件,而不是系统的头文件。

  

打开jni.h,我们可以找打这么一行

  

<强> 1。# include “jni_md.h”,,

  

这个头文件也要我们自己添加,它位于JAVA_HOME/include/win32目录中,添加方式和前面一致。

较详细的JNI简介