ステップバイステップ |
このステップでは、javah
ユーティリティプログラムを使用し、Java クラスのHelloWorld
か ら C 言語ヘッダーファイル (.h
ファイル) を作成する。このヘッダーファイルは C 言語側でHelloWorld
クラスを表す構造体を定義し、 そのクラスに定義されているネイティブメソッドdisplayHelloWorld()
を実装する C 言語関数の定義を行う。前のステップで作成した
HelloWorld
クラスに対し、ここでjavah
を実行する 。たとえば UNIX の 場合は、好みのシェルツールで次のコマンドを実行する。デフォルトで、% javah HelloWorldjavah
は.class
ファイルと同じディレクトリに新規の.h
ファイルを配置する。-d
オプションを指定すれば、ヘッダーファイルを別のディレクトリに配置するようjavah
に指示することができる。ヘッダーファイルの名前は Java クラス名の末尾に
.h
が追加されたものである。たとえば、上に示したコマンドでは、HelloWorld.h
という名前のファイ ルを作成する。クラス構造
ヘッダーファイルの内容を調べ、ClassHelloWorld
という名前の構造体に対する struct 定義が含まれていることに注意する。この構造体のメンバは対応 する Java クラスのメンバと一致する。つまり、struct のフィールドがクラスのイ ンスタンス変数と対応するということである。しかし、HelloWorld
にはインスタンス変数がないので、この構造体ではプレースホルダーがあるだけである。struct のメンバを使用すれば、 C 言語関数からクラスインスタンス変数 を参照することができる。関数定義
Java クラスを模倣した C 言語構造体に加え、次のような C 言語関数のシグニチャ も含まれている。これは、ステップ 5: C 言語関数を書くで 作成する C 言語関数のための定義である。この関数はextern void HelloWorld_displayHelloWorld(struct HHelloWorld *);HelloWorld
ク ラスのネイティブメソッドであるdisplayHelloWorld()
の実装を提供する。ネイティブメソッドの実装を書くときは、この関数シグニチャを使用しなければならない。HelloWorld
が他のネイティブメソッドを含んでいる場合は、それらの関数シグニチャが同様にこの場所に現れる。ネイティブメソッドを実装する C 言語関数の名前はパッケージ名、クラス名、およ び Java ネイティブメソッドの名前から得られる。 したがって、
HelloWorld
クラス内のネイティブメソッドdisplayHelloWorld()
は、HelloWorld_displayHelloWorld()
となる。ここの例では、HelloWorld
はデフォルトのパッケージにあ るため、パッケージ名はない。Java クラスで定義されたネイティブメソッドが何もパラメータを受け入れないよう になっていても、C 言語関数は パラメータを1つ受け入れることに注意する。このパラメータは C++ の "this" 変数とみなすことができる。ここの例では "this" パラメータを無視しているが、次 のレッスンでは "this" パラメータのデータをアクセスする方法について説明する 。
ステップバイステップ |