クラスを取得する
JNIEnvクラスのFindClassメソッドを使って、利用したいクラスのjava.lang.Classオブジェクトを取得する。
※取得したjclassオブジェクトは使い終わったらDeleteLocalRefをする
※但し、ネイティブ関数から抜けた時点で解放してくれるのでやらなくてもいい
こちらも参照
変数のフィールドIDを取得する
JNIEnvクラスのGetFieldIDメソッドを使って、利用したいメソッドのIDを取得する。
利用する変数の型に合わせて、 シグニチャーを指定する必要がある。
※シグニチャーについては以下を参照
https://docs.oracle.com/javase/jp/1.5.0/guide/jni/spec/types.html#wp276
値を操作する
値をセットする場合は、JNIEnvクラスのSet****Fieldメソッドを
値を取得する場合は、 JNIEnvクラスのGet****Fieldメソッドをそれぞれ使う。
(****の部分は変数の型に合わせたメソッド名)
package xxx; public class TestItem { public string id; public int count; };
void test(JNIEnv* pJEnv, jobject testItem) { jclass cls = pJEnv->FindClass("xxx/TestItem"); jfieldID mid1 = pJEnv->GetFieldID(cls, "id", "Ljava/lang/String;"); jfieldID mid2 = pJEnv->GetFieldID(cls, "count", "I"); jobject id = pJEnv->GetObjectField(testItem, mid1); pJEnv->SetIntField(testItem, mid2, 100); }
複数回メソッドを呼び出すような場合は、jclassとjfieldIDをその都度呼び出さず、始めに1度だけ取得してオーバーヘッドを減らす方がよいと思われる。
コメントをお書きください