Android NDKのローカル参照グローバル参照

ローカル参照

引数で渡されたりJNIEnvクラスで取得、作成したJavaオブジェクトはローカル参照となる。

ローカル参照はネイティブ関数の呼び出し期間中だけ有効。

ネイティブ関数から復帰すると自動的に解放される。

(自動で解放してくれるが、復帰するまではVMがメモリを持ち続けてしまうので、

 メモリを使い果たさないようDeleteLocalRefメソッドにて明示的に解放してあげる方がよさそう)


ネイティブ側にて、メンバ変数のような形でオブジェクトを持ち続けたい場合は、グローバル参照へと変換する必要がある。




グローバル参照

ネイティブ関数から復帰後でも、再び参照が可能。

不要になった時点で、DeleteGlobalRefメソッドにて明示的に解放する必要がある。


class CTest {
private:
    jclass m_CLS;

public:
    CTest();
    void Create(JNIEnv* pJEnv);
    void Release(JNIEnv* pJEnv);
};
CTest::CTest()
{
    m_CLS = NULL;
}

void CTest::Create(JNIEnv* pJEnv)
{
    jclass cls = pJEnv->FindClass("java/lang/String");
    m_CLS = (jclass)pJEnv->NewGlobalRef(cls);
    pJEnv->DeleteLocalRef(cls);
}

void CTest::Release(JNIEnv* pJEnv)
{
        if (NULL != m_CLS) {
        pJEnv->DeleteGlobalRef(m_CLS);
    }
}