ネイティブメソッドを実装する |
このページではネイティブメソッドの 2 つの側、つまり Java 側とネイティブ言語側をセットアップする方法を示す。Java 側
InputFile および OutputFile クラス両方でclose()
メソッドを見てみる。どちらのクラスでも、close()
の宣言は次のようになっている 。このメソッドシグニチャは、通常の、非ネイティブの Java メソッドのシグニチャと似ている。違いは、// in both InputFile.java and OutputFile.java public native void close();native
キーワードと、このメソッドには実装部分 がない ( "{" と "}" の間にコードがない) という点である。native
キーワードは、このメソッドが別の言語で実装されることをコンパイラに伝える。このメソッドの実装は Java ソースファイルにはないため、この宣言は文のターミネータシンボルであるセミコロン (;) で終了する。他の Java メソッドと同じように、ネイティブメソッドに引数を渡し、そこから値を返すことができる。ただし、
close()
メソッドは、 返り値の型void
と 空のパラメータリストからわかるように、そのどちらも行わない。InputFile および OutputFile クラスにある他のメソッドは、引数を受け入れ、値を返すようになっている。これについてはこのレッスンで後述する。ネイティブ言語側
ネイティブ言語側では、InputFile クラスと OutputFile クラス両方に対してclose()
メソッドを宣言し、実装しなければならない。初めに、2 つのclose()
メソッドを実装する各関数のシグニチャを記述する。 InputFile のclose()
関数のシグニチャは次のようになる。関数の名前がクラス名、下線 ( _ ) 文字、およびクラスで宣言されているとおりのネイティブメソッド名で構成されていることに注意する。したがって、推測どおり、OutputFile の// in InputFileImpl.c void InputFile_close(struct HInputFile *this) . . .close()
メソッドの関数シグニチャは次のようになる。関数名が異なっていることに注意する。 どちらの関数名も、ネイティブメソッドの実装を行おうとしているクラス名を含む。// in OutputFileImpl.c void OutputFile_close(struct HOutputFile *this) . . .
InputFile_close
とOutputFile_close
のどちらも、 Java 側でこれらのメソッドに対して何も引数が宣言されていない場合にも、引数を受 け入れていることに注意する。Java 実行時システムは常に、ネイティブメソッドへの最初の引数として自動パラメータ を引き渡す。 この引数は、このネイティブ言語関数の結合先であるネイティブメソッドを含んだオブジェクトへのハンドルである。この最初の引数はthis
ポインタとみなすことができる。次のページに、この引数に関する詳細を示す。これら 2 つの関数はどちらも値を返さないため、返り値は
void
であ る。これは Java 側で宣言された返り値の型と同一である。ただし、ネイティブメソッドから実際に値を返すときは、ネイティブ言語側の返り値のデータ型が Java 側の返り値と異なる可能性がある。値の受け渡しは慎重に行わなければならない。ネイティブメソッドから値を返すで、ネイティブメソッドからの値の返し方、および返り値のデータ型を Java 側とネイティブ言語側で一致させる方法について説明する 。
ネイティブメソッドを実装する |