Previous | Next | Trail Map | Integrating Native Methods into Java
Programs | ステップバイステップ


ステップ 3: .h ファイルを作成する

このステップでは、javah ユーティリティプログラムを使用し、Java クラスの HelloWorld か ら C 言語ヘッダーファイル (.h ファイル) を作成する。このヘッダーファイルは C 言語側で HelloWorld クラスを表す構造体を定義し、 そのクラスに定義されているネイティブメソッド displayHelloWorld() を実装する C 言語関数の定義を行う。

前のステップで作成した HelloWorld クラスに対し、ここで javah を実行する 。たとえば UNIX の 場合は、好みのシェルツールで次のコマンドを実行する。

% javah HelloWorld

デフォルトで、javah.class ファイルと同じディレクトリに新規の .h ファイルを配置する。-d オプションを指定すれば、ヘッダーファイルを別のディレクトリに配置するよう javah に指示することができる。

ヘッダーファイルの名前は Java クラス名の末尾に .h が追加されたものである。たとえば、上に示したコマンドでは、HelloWorld.hという名前のファイ ルを作成する。

クラス構造

ヘッダーファイルの内容を調べ、 ClassHelloWorld という名前の構造体に対する struct 定義が含まれていることに注意する。この構造体のメンバは対応 する Java クラスのメンバと一致する。つまり、struct のフィールドがクラスのイ ンスタンス変数と対応するということである。しかし、 HelloWorld にはインスタンス変数がないので、この構造体ではプレースホルダーがあるだけである。struct のメンバを使用すれば、 C 言語関数からクラスインスタンス変数 を参照することができる。

関数定義

Java クラスを模倣した C 言語構造体に加え、次のような C 言語関数のシグニチャ も含まれている。

extern void HelloWorld_displayHelloWorld(struct HHelloWorld *);

これは、ステップ 5: C 言語関数を書くで 作成する C 言語関数のための定義である。この関数は HelloWorld ク ラスのネイティブメソッドである displayHelloWorld() の実装を提供する。ネイティブメソッドの実装を書くときは、この関数シグニチャを使用しなければならない。HelloWorld が他のネイティブメソッドを含んでいる場合は、それらの関数シグニチャが同様にこの場所に現れる。

ネイティブメソッドを実装する C 言語関数の名前はパッケージ名、クラス名、およ び Java ネイティブメソッドの名前から得られる。 したがって、HelloWorld クラス内のネイティブメソッド displayHelloWorld() は、HelloWorld_displayHelloWorld() となる。ここの例では、 HelloWorld はデフォルトのパッケージにあ るため、パッケージ名はない。

Java クラスで定義されたネイティブメソッドが何もパラメータを受け入れないよう になっていても、C 言語関数は パラメータを1つ受け入れることに注意する。このパラメータは C++ の "this" 変数とみなすことができる。ここの例では "this" パラメータを無視しているが、次 のレッスンでは "this" パラメータのデータをアクセスする方法について説明する 。


Previous | Next | Trail Map | Integrating Native Methods into Java
Programs | ステップバイステップ