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 件のコメント:
コメントを投稿