Android NDKからJavaのメソッドを呼ぶ

クラスを取得する

JNIEnvクラスのFindClassメソッドを使って、利用したいクラスのjava.lang.Classオブジェクトを取得する。

 

※取得したjclassオブジェクトは使い終わったらDeleteLocalRefをする

※但し、ネイティブ関数から抜けた時点で解放してくれるのでやらなくてもいい

 こちらも参照

        jclass cls = pJEnv->FindClass("java/lang/String");

 

 

 

メソッドIDを取得する

JNIEnvクラスのGetMethodIDメソッドを使って、利用したいメソッドのIDを取得する。

スタティックメソッドの場合はGetStaticMethodIDメソッドとなるので使い分ける。

利用するメソッドの戻り値や引数に合わせて、 シグニチャーを指定する必要がある。

 

※シグニチャーについては以下を参照

https://docs.oracle.com/javase/jp/1.5.0/guide/jni/spec/types.html#wp276 

        jclass    cls = pJEnv->FindClass("java/lang/String");
        jmethodID mid = pJEnv->GetMethodID(cls, "toCharArray", "()[C");

 

 

 

メソッドを呼び出す

JNIEnvクラスのCall****Methodメソッドを使って、利用したいメソッドの呼び出す。

スタティックメソッドの場合はCallStatic****Methodメソッドとなるので使い分ける。

****の部分は戻り値に合わせたメソッド名) 

void test(JNIEnv* pJEnv, jstring str)
{
        jclass     cls = pJEnv->FindClass("java/lang/String");
        jmethodID  mid = pJEnv->GetMethodID(cls, "toCharArray", "()[C");
        jcharArray ary = pJEnv->CallObjectMethod(str, mid);
}

 

 

 

複数回メソッドを呼び出すような場合は、jclassとjmethodIDをその都度呼び出さず、始めに1度だけ取得してオーバーヘッドを減らす方がよいと思われる。