JNI: java native interface的缩写,java的本地调用,主要是为c/c++设计的。
一般的调用步骤:
1.在java类中声明native方法,javac编译该文件为class文件
2.使用javah命令生成包含native方法声明的c/c++头文件
3.vs中创建工程,添加生成的头文件和需要引用的头文件
4.根据生成的头文件写c/c++源文件,并编译成动态链接库(dll)
5.将dll文件放到项目中,在java中加载动态链接库,然后使用里面的方法
目录结构:
java代码中声明本地方法:
public class TestJni {
/**
* java调用c++
* @return
*/
public native void getjni();
}
使用javac命令,编译为字节码文件:
在该目录下就可以得到同名的class文件:
使用javah命令,得到头文件。文件要写绝对路径,路径要定位到包前,不要进入包(否则会报文件未找到错误):
这样就可以在项目中得到同名头文件(.h):
打开该文件你会看到,要引入jni.h文件:
创建c++工程:
新建项目,创建win32控制台程序:
点击下一步。
选择“dll”类型的空项目:
点击完成。
将需要的三个头文件复制到项目路径中。
jni.h在jdk的include目录下:
jni_md.h在jdk的include-->win32目录下:
新建空白源文件:
将头文件中声明的方法复制过来,写入具体的实现:
然后调试成功:
在debug目录下找到生成的dll文件:
工程结构:
将生成的dll文件复制到java项目中,是在根目录下,不要放到src里面:
在java中加载动态链接库,然后使用该方法:
public class TestMain {
public static void main(String[] args) {
System.loadLibrary("ConsoleApplication1");
TestJni tjni = new TestJni();
tjni.getjni();
}
}
运行结果:
注意:
1.javah工具,我们通过它来生产jni头文件:
2.项目中添加的头文件不仅仅是你编译生成的那个,还需要jni.h 和jni_md.h,它们存放在jdk路径下,没有的话,会报文件未找到错误。
3.“jni.h”或者"jni_md.h"报错:找不到文件或者路径。<jni.h>这样是在系统目录下找的,改为"jni.h"这样就可以在项目目录下找到了。