JNI関数AttachCurrentThread()
から入手したJNIEnv *
の寿命について知りたいと思います。 JNIEnv
ポインタを取得する次の関数を考えてみましょう。JNIでは、AttachCurrentThread()から返されたJNIEnvポインタのクリーンアップ関数はありますか?
JNIEnv * RetrieveJniEnvPtr()
{
JavaVM * pJavaVM; // Assume pJavaVM is already initialized
JNIEnv * pEnv = NULL;
if(pJavaVM->GetEnv((void**)&pEnv, JNI_VERSION_1_6) != JNI_OK)
{
pJavaVM->AttachCurrentThread((void**) &pEnv, NULL);
}
return pEnv;
}
AttachCurrentThread()
へのコールに関連付けられたクリーンアップコールはありますか。
また、これは軽量機能ですか?同じスレッド内で(この例では)RetrieveJniEnvPtr()
を何度も呼び出すのが標準的なプログラミング方法ですか?コードはスレッドの寿命の間に一度だけJNIEnv *
を取得する必要がありますか?
呼び出し元は、現在のスレッドがちょうど接続されているかどうかわからないため、あとでDetachCurrentThreadを呼び出す必要があるため、コード構造はやや劣ります。代わりにネイティブコールバック関数の最も外側のレベルでアタッチ/デタッチを直接処理する必要があります。 – technomage