從 Java 類別產生 JNI 標頭。
此任務執行時,會產生實作原生方法所需的 C 標頭和原始檔。
如果您使用 Java 8 或以上版本進行建置,請考慮改用 javac
的 nativeheaderdir 屬性,它讓您可以在單一步驟中編譯類別並產生原生標頭檔。
注意:javah
已在 Java 9 中標示為已棄用,並在 Java 10 中移除。嘗試在 Java 10 中使用它將會失敗。
可以使用不同的編譯器。這可以使用 implementation 屬性或巢狀元素來選擇。以下是屬性的選項
default—平台的預設編譯器。
sun—JDK 的標準編譯器。
kaffeh—Kaffe 的原生標準編譯器。
gcjh—gcj 和 gij 的原生標準編譯器。自 Apache Ant 1.8.2 起
forking—透過其命令列介面在個別程序中執行 javah 執行檔。自 Ant 1.9.8 起在不執行 Kaffe 或 gcj/gij 時為預設值
注意:如果您使用此任務處理多個檔案,在某些作業系統上命令列可能會變得過長。很遺憾的是,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>
元素為編譯器指定其他命令列引數。這些元素的指定方式類似於 命令列引數,但具有額外的屬性,可用於僅在使用特定編譯器實作時啟用引數。
屬性 | 說明 | 必要 |
---|---|---|
value | 請參閱 命令列引數。 | 其中之一 |
line | ||
file | ||
path | ||
prefix | 請參閱 命令列引數。自 Ant 1.8 起。 | 否 |
suffix | 否 | |
實作 | 僅在所選的編譯器實作與此屬性的值相符時,傳遞指定的引數。合法值與上述 清單 中有效的編譯器相同。) | 否 |
自 Ant 1.8.0 起
一個 類別路徑結構,如果已指定自訂類別,則在載入編譯器實作時使用此結構來儲存類別路徑。使用內建編譯器時不會產生任何效果。
自 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
介面卡可以支援自己的屬性和巢狀元素。