2014年3月15日土曜日

JNI (Java Native Interface) (5) 変数の設定、メソッド呼び出し

JNIを使って Javaの変数フィールド を扱う方法を見ていきましょう。

javahで生成された関数プロトタイプは以下の様でした。

JNIEXPORT void JNICALL
Java_jp_sprix_jni_ImageRecognize_queryImage(JNIEnv *env, jobject obj){

すべての関数プロトタイプは JNIEnvポインタ が最初の引数として宣言されます。
C++ネイティブコードは、JNIEnvポインタ で自分のメソッド(this)と同じように使うことができます。C++オブジェクトは、同様の方法で自分自身のメソッドへのポインタを保持しているので、このように使うことができます。

では、Javaのデータフィールドを操作してみましょう。

オブジェクトのデータフィールドにネイティブからアクセスする

以下のようなJavaコードがあったとしましょう。

privateなint型の変数と、同じ型ですがstaticな変数を宣言しています。
それぞれの値をsetするnativeメソッドを作っておきましょう。

javahで生成した関数プロトタイプが以下です。

関数プロトタイプの実装は以下のようにできます。

これらからわかることを整理してみましょう。

  • staticとそうでないデータフィールドにアクセスするには、それぞれ違い関数集合がある
  • staticなデータフィールドを参照する場合、jclass への参照が必要
  • 非静的なデータフィールドを参照する場合、jobject への参照が必要
  • データフィールドを操作するJNI関数は、アクセスするデータ型を名前に含む


次は、Javaオブジェクトのデータフィールドを取得してみましょう。

0 件のコメント:

コメントを投稿