javah 是 JDK 早期版本提供的工具,用於從 Java 類別產生 C/C++ 標頭檔(.h)與樁檔(stub),支援 JNI(Java Native Interface)開發。注意:JDK 10 起已移除 javah,改用 javac -h 替代。
javah [選項] 類別名稱 [其他類別...]
類別名稱使用完整限定名,不需 加 .class 副檔名。
| 選項 | 功能說明 |
|---|---|
-o <檔案> | 將所有輸出合併至單一檔案 |
-d <目錄> | 指定輸出目錄 |
-td <目錄> | 指定暫存檔目錄(預設為 tmp) |
-stubs | 產生樁檔而非標頭檔 |
-verbose | 顯示處理狀態至標準輸出 |
-classpath <路徑> | 指定類別搜尋路徑(多路徑用分號分隔) |
JDK 8+ 推薦直接使用編譯器產生標頭檔:
# 編譯並同步產生 .h 檔到 include 目錄
javac -h include -d build/classes src/com/example/NativeDemo.java
優點:單一指令完成編譯與標頭檔產生,避免版本不一致。
native 方法javac -h include MyClass.java.h 實作 C/C++ 函式.so/.dll/.dylib)System.loadLibrary 載入JNIEXPORT/JNICALL 巨集:跨平台匯出修飾詞Java_套件名_類別名_方法名(JNIEnv*, jobject, ...)jint、jstring、jobjectArray 等_ 轉為 _1,需注意對應。ThrowNew,不可直接 throw。建議使用 CMake 或 Gradle 整合原生編譯,搭配 javac -h 自動化流程,避免手動維護標頭檔。