Javah

說明

從 Java 類別產生 JNI 標頭。

此任務執行時,會產生實作原生方法所需的 C 標頭和原始檔。

如果您使用 Java 8 或以上版本進行建置,請考慮改用 javacnativeheaderdir 屬性,它讓您可以在單一步驟中編譯類別並產生原生標頭檔。

注意javah 已在 Java 9 中標示為已棄用,並在 Java 10 中移除。嘗試在 Java 10 中使用它將會失敗。

可以使用不同的編譯器。這可以使用 implementation 屬性或巢狀元素來選擇。以下是屬性的選項

注意:如果您使用此任務處理多個檔案,在某些作業系統上命令列可能會變得過長。很遺憾的是,javah 命令不支援命令引數檔,就像 javac(例如)一樣,因此只能將要編譯的類別數量分成較小的區塊。

參數

屬性 說明 必要
class 類別的完整限定名稱(或類別,以逗號分隔)
outputFile 將所有列出的類別的產生標頭或原始檔串接成此檔 兩個中只有一個
destdir 設定 javah 儲存標頭檔或 stub 檔的目錄。
force 指定輸出檔應始終寫入(僅在使用 JDK 1.2 的外部 javah 時)
old 指定應產生舊的 JDK 1.0 風格標頭檔(否則輸出檔包含 JNI 風格原生方法函數原型)(僅在使用 JDK 1.2 的外部 javah 時)
stubs 從 Java 物件檔產生 C 宣告(與 old 搭配使用)
verbose 導致 javah 列印有關產生檔狀態的訊息
classpath 要使用的類別路徑
bootclasspath 引導類別檔的位置
extdirs 已安裝擴充套件的位置
實作 要使用的編譯器實作。(請參閱上述 清單 中有效的編譯器。) 否;預設為目前 JDK 的預設編譯器

指定為巢狀元素的參數

arg

您可以使用巢狀的 <arg> 元素為編譯器指定其他命令列引數。這些元素的指定方式類似於 命令列引數,但具有額外的屬性,可用於僅在使用特定編譯器實作時啟用引數。

屬性 說明 必要
value 請參閱 命令列引數 其中之一
line
file
path
prefix 請參閱 命令列引數自 Ant 1.8 起
suffix
實作 僅在所選的編譯器實作與此屬性的值相符時,傳遞指定的引數。合法值與上述 清單 中有效的編譯器相同。)

implementationclasspath

自 Ant 1.8.0 起

一個 類別路徑結構,如果已指定自訂類別,則在載入編譯器實作時使用此結構來儲存類別路徑。使用內建編譯器時不會產生任何效果。

實作 JavahAdapter 類型的任何巢狀元素

自 Ant 1.8.0 起

如果已定義的類型實作 JavahAdapter 介面,則可以使用該類型的巢狀元素作為 implementation 屬性的替代方案。

範例

使用 JDK 1.2 JNI 模型建立命名類別的 JNI 標頭。假設目錄 c 已存在,檔案 org_foo_bar_Wibble.h 會建立在該目錄中。如果此檔案已存在,則不會變更。

<javah destdir="c" class="org.foo.bar.Wibble"/>

這與前一個範例類似,但輸出會寫入目前目錄中名為 wibble.h 的檔案。

<javah outputFile="wibble.h">
  <class name="org.foo.bar.Wibble,org.foo.bar.Bobble"/>
</javah>

寫入三個標頭檔案,每個檔案對應一個已命名的類別。由於已設定 force 選項,因此即使這些標頭檔案已存在,也會在呼叫 Javah 工作時寫入這些檔案。

<javah destdir="c" force="yes">
  <class name="org.foo.bar.Wibble"/>
  <class name="org.foo.bar.Bobble"/>
  <class name="org.foo.bar.Tribble"/>
</javah>

使用「舊」JNI 格式寫入三個類別的標頭,然後寫入對應的 .c stub。Javah 會因為 verbose 選項而描述其進度。

<javah destdir="c" verbose="yes" old="yes" force="yes">
  <class name="org.foo.bar.Wibble"/>
  <class name="org.foo.bar.Bobble"/>
  <class name="org.foo.bar.Tribble"/>
</javah>
<javah destdir="c" verbose="yes" stubs="yes" old="yes" force="yes">
  <class name="org.foo.bar.Wibble"/>
  <class name="org.foo.bar.Bobble"/>
  <class name="org.foo.bar.Tribble"/>
</javah>

如果您想使用自訂的 JavahAdapter org.example.MyAdapter,您可以使用 implementation 屬性

<javah destdir="c" class="org.foo.bar.Wibble"
       implementation="org.example.MyAdapter"/>

或定義一個類型並將其巢狀到工作中,如下所示

<componentdef classname="org.example.MyAdapter"
              name="myadapter"/>
<javah destdir="c" class="org.foo.bar.Wibble">
  <myadapter/>
</javah>

在這種情況下,您的 javah 介面卡可以支援自己的屬性和巢狀元素。