JavaクラスからJNIヘッダーを生成します。
このタスクが実行されると、ネイティブメソッドを実装するために必要なCヘッダーファイルとソースファイルが生成されます。
Java 8以降でビルドする場合は、javac
のnativeheaderdir属性を使用することを検討してください。これにより、クラスのコンパイルとネイティブヘッダーファイルの生成を1つのステップで実行できます。
注記: javah
はJava 9で非推奨となり、Java 10で削除されました。Java 10でjavah
を使用しようとすると失敗します。
異なるコンパイラを使用できます。これはimplementation属性またはネストされた要素で選択できます。属性の選択肢は以下のとおりです。
default—プラットフォームのデフォルトコンパイラ。
sun—JDKの標準コンパイラ。
kaffeh—Kaffeのネイティブ標準コンパイラ。
gcjh—gcjとgijのネイティブ標準コンパイラ。Apache Ant 1.8.2以降
forking—javah実行可能ファイルをコマンドラインインターフェースを介して別プロセスで実行します。Kaffeまたはgcj/gijで実行していない場合のデフォルト(Ant 1.9.8以降)。
注記: このタスクを使用して複数のファイルで作業する場合、一部のオペレーティングシステムではコマンドラインが長すぎる可能性があります。javahコマンドはjavac(例)のようにコマンド引数ファイルに対応していないため、コンパイルするクラスの数を小さなチャンクに分割することしかできません。
属性 | 説明 | 必須 |
---|---|---|
class | クラスの完全修飾名(またはカンマで区切られた複数のクラス名) | はい |
outputFile | リストされたすべてのクラスの結果ヘッダーファイルまたはソースファイルをこのファイルに連結します。 | 2つのうちちょうど1つ |
destdir | javahがヘッダーファイルまたはスタブファイルを保存するディレクトリを設定します。 | |
force | 出力ファイルが常に書き込まれるように指定します(JDK 1.2の外部javahを使用する場合のみ)。 | いいえ |
old | 古いJDK 1.0スタイルのヘッダーファイルが生成されるように指定します(それ以外の場合は、出力ファイルにJNIスタイルのネイティブメソッド関数プロトタイプが含まれます)(JDK 1.2の外部javahを使用する場合のみ)。 | いいえ |
stubs | JavaオブジェクトファイルからC宣言を生成します(oldと共に使用)。 | いいえ |
verbose | javahが生成されたファイルのステータスに関するメッセージを出力するようにします。 | いいえ |
classpath | 使用するクラスパス。 | いいえ |
bootclasspath | ブートストラップクラスファイルの場所。 | いいえ |
extdirs | インストールされた拡張機能の場所。 | いいえ |
implementation | 使用するコンパイラのインプリメンテーション。(有効なコンパイラのリストを参照してください)。 | いいえ; 現在のJDKのデフォルトコンパイラがデフォルト。 |
ネストされた<arg>
要素を使用して、コンパイラに追加のコマンドライン引数を指定できます。これらの要素はコマンドライン引数のように指定されますが、特定のコンパイラの実装が使用される場合にのみ引数を有効にするために使用できる追加の属性があります。
属性 | 説明 | 必須 |
---|---|---|
value | コマンドライン引数を参照してください。 | これらのうちちょうど1つ |
line | ||
file | ||
path | ||
prefix | コマンドライン引数を参照してください。Ant 1.8以降。 | いいえ |
suffix | いいえ | |
implementation | 選択されたコンパイラのインプリメンテーションがこの属性の値と一致する場合にのみ、指定された引数を渡します。有効な値は、上記の有効なコンパイラのリストと同じです。 | いいえ |
Ant 1.8.0以降
カスタムクラスが指定されている場合、コンパイラの実装をロードする際に使用するクラスパスを保持するパスのような構造。組み込みのコンパイラの1つを使用する場合は効果がありません。
JavahAdapter
を実装するタイプのネストされた要素Ant 1.8.0以降
定義された型がJavahAdapter
インターフェースを実装する場合、その型のネストされた要素をimplementation属性の代わりに使用できます。
指定されたクラスのJNIヘッダーを、JDK 1.2 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>
3つのヘッダーファイル(名前付きクラスごとに1つ)を書き込みます。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>
'old' JNI形式を使用して3つのクラスのヘッダーを書き込み、対応する.cスタブを書き込みます。verboseオプションにより、Javah
は進行状況を説明します。
<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
アダプターは独自の属性とネストされた要素をサポートできます。