自学完JNI已经好久了,忘了更新博客,这两天把它补上,
JNI,全称为Java native interface ,是Java本地接口的意思,它提供了若干的API实现了Java和其他语言的通信(主要是C&C++),JNI标准是java平台的一部分,它允许Java代码和其他语言写的代码进行交互。但是,通过Java与本地已编译好的代码进行交互,这样会失去代码的可移植性,然而有时候这是必要的,比如使用一些库,或者是提高程序的性能。那下面就简单讲解一下JNI调用的步骤,实现一个简单的两数加法的例子。
1.新建一个Java工程,在Java类中声明一个native方法,不需要实现,
2.到Java工程的bin目录下使用javah命令生成包含native 方法定义的c/c++头文件,记得要带上包名,
3.在VC++ 6.0中新建一个DLL(动态链接库)工程,把生成的头文件,以及jni.h和jni_md.h复制到工程目录下,并把生成的头文件添加到工程中。
注意:jni.h,jni_md.h文件在你安装的jdk目录的includ、win32文件夹下面,如果不加这两个文件,在待会的运行中会报错。
4.打开添加的头文件,按照头文件编写源文件,复制头文件中的方法声明到源文件中进行实现,参数定义要写全,并且要添加头部引用;
在这里做个简单的说明:a.由于jni.h文件已经放入到工作空间当中,所以头文件中#include<jni.h>需要改为#include "jni.h",因为这个文件已经在当前目录下,使用“”才能加载到这个文件;
b.方法的参数:JNIEnv *env,jobject,指针和对象,一般来说简单的程序中很少用到这两个参数,这两个参数一般在调用反向JNI的时候就会起到关键性作用,jint x,int y就是在Java程序中传入的参数
5.将c/c++源文件编译成动态链接库文件(.dll),在这里,很有可能会出现一下的错误 jni.h找不到,那么就是前面说到的文件没有复制进去或者是文件中的头部没有修改。
编译无错了之后,运行成功,那么就在项目空间中debug文件夹下面生成了一个.dll文件
6.接下来我们把这个.dll文件拷贝到Java工程下面,并编写调用代码
我们在Main函数中通过System.loadLirbrary(“链接库名称”)调用动态链接库,不需要写上后缀名,然后实例化这个类,调用native方法,传入参数,打印出来,之后我们就可以运行这个程序了。
以上只是实现了简单加法操作,目的呢是讲解一下jni的调用步骤。
在调用JNI的过程中,如果想让多个Java工程调用同一个.dll文件,我们可以把生成的.dll文件所在的路径加到环境变量path路径下面,这样的话,重新启动eclipse之后,.dll文件就可以直接被多个工程调用了。