首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 原生介面開發:javah 標頭檔產生器完整指南

     編輯:Java 相關知識

javah 工具簡介

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 <路徑>指定類別搜尋路徑(多路徑用分號分隔)

現代替代方案:javac -h

JDK 8+ 推薦直接使用編譯器產生標頭檔:

# 編譯並同步產生 .h 檔到 include 目錄
javac -h include -d build/classes src/com/example/NativeDemo.java

優點:單一指令完成編譯與標頭檔產生,避免版本不一致。

JNI 開發流程概覽

  1. 在 Java 類別宣告 native 方法
  2. 編譯 Java 類別:javac -h include MyClass.java
  3. 依產生的 .h 實作 C/C++ 函式
  4. 編譯為共享庫(.so/.dll/.dylib)
  5. Java 端用 System.loadLibrary 載入

產生的標頭檔關鍵內容

  • JNIEXPORT/JNICALL 巨集:跨平台匯出修飾詞
  • 函式簽名:Java_套件名_類別名_方法名(JNIEnv*, jobject, ...)
  • 型別對應:jint、jstring、jobjectArray 等

常見坑點

  • 套件名含底線:標頭檔函式名會將 _ 轉為 _1,需注意對應。
  • 多載方法:JNI 依參數型別區分,C 端需實作對應簽名。
  • 例外處理:C 端拋出例外需用 ThrowNew,不可直接 throw。

建議工具鏈

建議使用 CMake 或 Gradle 整合原生編譯,搭配 javac -h 自動化流程,避免手動維護標頭檔。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved