Previous | Next | Trail Map | Integrating Native Methods into Java
Programs | ネイティブメソッドを実装する


メソッドシグニチャと関数シグニチャ

このページではネイティブメソッドの 2 つの側、つまり Java 側とネイティブ言語側をセットアップする方法を示す。

Java 側

InputFile および OutputFile クラス両方で close() メソッドを見てみる。どちらのクラスでも、close() の宣言は次のようになっている 。

    // in both InputFile.java and OutputFile.java
public native void close();

このメソッドシグニチャは、通常の、非ネイティブの Java メソッドのシグニチャと似ている。違いは、native キーワードと、このメソッドには実装部分 がない ( "{" と "}" の間にコードがない) という点である。native キーワードは、このメソッドが別の言語で実装されることをコンパイラに伝える。このメソッドの実装は Java ソースファイルにはないため、この宣言は文のターミネータシンボルであるセミコロン (;) で終了する。

他の Java メソッドと同じように、ネイティブメソッドに引数を渡し、そこから値を返すことができる。ただし、close() メソッドは、 返り値の型 void と 空のパラメータリストからわかるように、そのどちらも行わない。InputFile および OutputFile クラスにある他のメソッドは、引数を受け入れ、値を返すようになっている。これについてはこのレッスンで後述する。

ネイティブ言語側

ネイティブ言語側では、InputFile クラスと OutputFile クラス両方に対してclose() メソッドを宣言し、実装しなければならない。初めに、2 つの close() メソッドを実装する各関数のシグニチャを記述する。 InputFile の close() 関数のシグニチャは次のようになる。

    // in InputFileImpl.c
void InputFile_close(struct HInputFile *this)
    . . .

関数の名前がクラス名、下線 ( _ ) 文字、およびクラスで宣言されているとおりのネイティブメソッド名で構成されていることに注意する。したがって、推測どおり、OutputFile の close() メソッドの関数シグニチャは次のようになる。

    // in OutputFileImpl.c
void OutputFile_close(struct HOutputFile *this)
    . . .

関数名が異なっていることに注意する。 どちらの関数名も、ネイティブメソッドの実装を行おうとしているクラス名を含む。

InputFile_closeOutputFile_close のどちらも、 Java 側でこれらのメソッドに対して何も引数が宣言されていない場合にも、引数を受 け入れていることに注意する。Java 実行時システムは常に、ネイティブメソッドへの最初の引数として自動パラメータ を引き渡す。 この引数は、このネイティブ言語関数の結合先であるネイティブメソッドを含んだオブジェクトへのハンドルである。この最初の引数は this ポインタとみなすことができる。次のページに、この引数に関する詳細を示す。

これら 2 つの関数はどちらも値を返さないため、返り値は void であ る。これは Java 側で宣言された返り値の型と同一である。ただし、ネイティブメソッドから実際に値を返すときは、ネイティブ言語側の返り値のデータ型が Java 側の返り値と異なる可能性がある。値の受け渡しは慎重に行わなければならない。ネイティブメソッドから値を返すで、ネイティブメソッドからの値の返し方、および返り値のデータ型を Java 側とネイティブ言語側で一致させる方法について説明する 。


Previous | Next | Trail Map | Integrating Native Methods into Java
Programs | ネイティブメソッドを実装する