Java Native Interface (JNI) 讓 Java 呼叫 C/C++ 實作的高效能或平台相關功能。本文以 HelloWorld 為例,完整示範:Java 宣告 native 方法 → javac 編譯 → javah 生成 .h → C++ 實作 → 編譯動態庫 → Java 載入執行。
public class HelloWorld {
public native void displayHelloWorld(); // 無實作體
static {
System.loadLibrary("hello"); // 載入 hello.dll (Windows) 或 libhello.so (Linux)
}
public static void main(String[] args) {
new HelloWorld().displayHelloWorld();
}
}
javac HelloWorld.java
javah -jni HelloWorld
// 產生 HelloWorld.h,包含 JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld(JNIEnv*, jobject);
#include
#include
#include "HelloWorld.h"
JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld(JNIEnv *env, jobject obj) {
printf("Hello from C++!\n");
}
Windows (MSVC):
cl -I"%JAVA_HOME%\include" -I"%JAVA_HOME%\include\win32" -LD HelloWorldImpl.cpp -Fehello.dll
Linux/macOS (GCC):
gcc -shared -fPIC -I"$JAVA_HOME/include" -I"$JAVA_HOME/include/linux" \
HelloWorldImpl.cpp -o libhello.so
java -Djava.library.path=. HelloWorld
// 輸出: Hello from C++!
Java_包名_類名_方法名,包名用底線分隔,若類在包內需包含包路徑。jint↔int、jstring 需用 GetStringUTFChars/ReleaseStringUTFChars、jobjectArray 對應 Java 陣列。ThrowNew(env, clazz, msg) 拋出 Java 異常。AttachCurrentThread。GetPrimitiveArrayCritical 或 Direct Buffer。