JNI (Java Native Interface) 從 Java 1.1 成為平台標準,允許 Java 代碼與本地已編譯語言(主要是 C/C++)交互。雖設計針對 C/C++,但任何支持調用約定的語言均可使用。
無 JNI 時上述場景開發維護成本極高。
class HelloWorld {
private native void print();
static { System.loadLibrary("HelloWorld"); }
public static void main(String[] args) { new HelloWorld().print(); }
}
javac HelloWorld.java
javah -jni HelloWorld
生成 HelloWorld.h,包含函數聲明 Java_HelloWorld_print(命名規則:Java_類全名_方法名)。
HelloWorld.c:
#include
#include "HelloWorld.h"
#include
JNIEXPORT void JNICALL Java_HelloWorld_print(JNIEnv *env, jobject obj) {
printf("Hello from C!\\n");
}
Linux 編譯命令:
gcc -I/usr/lib/jvm/java-6-sun/include -I/usr/lib/jvm/java-6-sun/include/linux \
-fPIC -shared -o libHelloWorld.so HelloWorld.c
Windows 用 cl.exe 或 MinGW 生成 HelloWorld.dll。
java -Djava.library.path=. HelloWorld
輸出:Hello from C!
System.loadLibrary 參數不帶前綴「lib」和後綴「.so/.dll」,跨平台自動映射。-Djava.library.path 指定動態庫搜索路徑,亦可將庫放入系統路徑 (PATH/LD_LIBRARY_PATH)。jobject (局部引用)、jglobalRef (全局引用)、jweak (弱引用),生命周期管理至關重要。ThrowNew,Java 端捕獲。出處:博客原文