JNI使用方法记录
JNI是用来干嘛的
JNI 全称是Java Native Interface,中文译名叫java本地接口。
当需要实现一些Java语言难以完成的事情时,就可以考虑使用JNI来调用其他的语言库来实现。
怎么在自己的代码中使用JNI
本文将简洁地展示使用JNI调用dll的过程。
- 第一步,编写有native方法的类
文件HellpJNI.java
内容如下:public class HelloJNI { /** * 这是native方法,稍后会在要导入的dll中定义方法体 */ native public void sayHello(); public static void main(String[] args) { // 这里打印java的library,dll是在library目录里进行查询 System.out.println(System.getProperty("java.library.path")); HelloJNI h = new HelloJNI(); // 导入dll // 用System.load 或者 System.loadLibrary 进行导入dll System.loadLibrary("HelloJNI"); // 调用native方法 h.sayHello(); }
}
```
-
第二步,将第一步中的类编译为class文件
javac HelloJNI.java
这一步会生成
HelloJNI.class
文件 -
第三步,使用javah按照第二步的class文件中的native方法定义生成c语言的头文件
javah HelloJNI
这里会生成一个.h文件
HelloJNI.h
,该文件内容如下:/* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class HelloJNI */ #ifndef HelloJNI #define HelloJNI #ifdef __cplusplus extern "C" { #endif /* * Class: HelloJNI * Method: sayHello * Signature: ()V */ // 这里是函数的定义 JNIEXPORT void JNICALL HelloJNI_sayHello (JNIEnv *, jobject); #ifdef __cplusplus } #endif #endif
-
第四步,按照第四步的.h文件中的函数定义,定义函数体
文件HelloJNI.c
内容如下:#include <stdio.h> #include <jni.h> #include "com_wby_wincontrol_jni_HelloJNI.h" JNIEXPORT void JNICALL HelloJNI_sayHello (JNIEnv *param, jobject object){ printf("hello"); return; }
-
第五步,将第四步的.c文件生成动态链接库dll
gcc -shared -I %JAVA_HOME%/include -I %JAVA_HOME%/include/win32 HelloJNI.c -o HelloJNI.dll
-shared
表示生成动态链接库
-o
表示输入的文件名
-I
表示头文件的查询路径,以上两个路径是java JNI 必要的头文件,因为没有添加到gcc的查找路径里,所以需要手动指定路径这一步会生成
HelloJNI.dll
文件 -
第六步,将dll添加到java项目的library中
如果你使用的是IDEA或者Eclipse,可以直接添加到library中
如IDEA,进入project structure ,按照下图,选择dll文件后一路点击ok
如果直接使用java命令启动,可以将dll所在目录添加到系统的环境变量
-
第七步,启动项目
注意事项
- native方法调用前,必须要引用dll文件,这个引入的操作,不一定在这个类加载的时候引入,意思是可以在其他类中使用System.loadLibrary()方法引入
- native方法调用时,如果dll中没有定义,会报错;如果未定义但是不调用,则不会报错
System.load()
的参数是dll的绝对路径;System.loadLibrary()
的参数是dll的文件名System.getProperty("java.library.path")
其实就是系统环境变量path中的目录