native 方法的 Java 類別javac 編譯產生 .classjavac -h(JDK 8+)或 javah -jni(JDK 8 前)生成 C/C++ 頭文件 .h.dll、Linux .so、macOS .dylib)System.loadLibrary)並運行// HelloWorld.java
public class HelloWorld {
// 宣告原生方法,無實作
public native void displayHelloWorld();
// 靜態區塊載入動態庫
static {
System.loadLibrary("hello"); // 對應 hello.dll / libhello.so
}
public static void main(String[] args) {
new HelloWorld().displayHelloWorld();
}
}
javac HelloWorld.java
# JDK 8+
javac -h . HelloWorld.java
# JDK 8 前
javah -jni HelloWorld
產生 HelloWorld.h 關鍵內容:
/* DO NOT EDIT - machine generated */
#include
#ifndef _Included_HelloWorld
#define _Included_HelloWorld
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: HelloWorld
* Method: displayHelloWorld
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
命名規則: Java_包名_類名_方法名(包名以 _ 分隔,無包名則直接類名)。
// HelloWorldImpl.c
#include
#include "HelloWorld.h"
#include
JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld
(JNIEnv *env, jobject obj) {
printf("Hello World from C!\n");
return;
}
關鍵點:
jni.h(位於 $JAVA_HOME/include、$JAVA_HOME/include/win32 或 linux)。.h 確保簽名一致。cl -I"%JAVA_HOME%\include" -I"%JAVA_HOME%\include\win32" -LD HelloWorldImpl.c -Fehello.dll
-I 指定頭文件搜尋路徑-LD 生成 DLL-Fe 指定輸出檔名(必須與 loadLibrary 參數一致)gcc -shared -fPIC -I"$JAVA_HOME/include" -I"$JAVA_HOME/include/linux" \
HelloWorldImpl.c -o libhello.so
# macOS
clang -shared -fPIC -I"$JAVA_HOME/include" -I"$JAVA_HOME/include/darwin" \
HelloWorldImpl.c -o libhello.dylib
# Windows
java -Djava.library.path=. HelloWorld
# Linux/macOS
java -Djava.library.path=. HelloWorld
# 或設定 LD_LIBRARY_PATH / DYLD_LIBRARY_PATH
輸出:Hello World from C!
JNIEnv*:每執行緒獨立,提供所有 JNI 函數表指標。jobject:傳入的 Java 物件引用(對應 this)。static 載入塊:確保庫在首次使用前載入,且僅載入一次。System.loadLibrary("name") 自動添加平台前綴/後綴(libname.so、name.dll)。.h 並重新編譯 C 代碼。javah 生成不一致。GetStringUTFChars/Get*ArrayElements 未配對 Release。ThrowNew)。JNI 是 Java 呼叫原生代碼的標準橋樑。掌握「Java 宣告 → 編譯 → 生成頭文件 → C 實現 → 編譯動態庫 → 載入運行」標準流程,配合 javac -h 自動化頭文件生成,即可高效構建高效能、跨平台的混合應用。下篇將深入類型映射、字串陣列操作、方法與欄位存取等進階主題。