ローカル参照
引数で渡されたり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); } }
コメントをお書きください