Android NDKからJavaのメンバ変数を操作

クラスを取得する

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度だけ取得してオーバーヘッドを減らす方がよいと思われる。