| ステップバイステップ |
このステップでは、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" パラメータのデータをアクセスする方法について説明する 。
| ステップバイステップ |