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中的目錄