2012-04-28 6 views
4

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 *を取得する必要がありますか?

+1

呼び出し元は、現在のスレッドがちょうど接続されているかどうかわからないため、あとでDetachCurrentThreadを呼び出す必要があるため、コード構造はやや劣ります。代わりにネイティブコールバック関数の最も外側のレベルでアタッチ/デタッチを直接処理する必要があります。 – technomage

答えて

6

クリーンアップ機能はDetachCurrentThread()です。既にJNIEnv*がJNIメソッドに渡されているか、自分の開発中のネイティブスレッドに入っている場合は、を知らせるようにコードを構造化する必要があります。その場合は、他のJNIコールの前にAttachCurrentThread()にコールし、その後はDetachCurrentThread()にコールする必要があります。この要件から隠そうとしないでください。

+0

これは私が作成したネイティブスレッドになります。 'AttachCurrentThread()'の各呼び出しに一致するように 'DetachCurrentThread()'が呼び出される限り、同じスレッドは安全に 'AttachCurrentThread()'を軽量に複数回呼び出すことができますか? –

+0

実際、上記のコードは 'AttachCurrentThread()'が一度だけ呼び出されることを保証しています。スレッドが終了すると、AttachCurrentThread()を呼び出した直後に 'DetachCurrentThread()'を呼び出すことができますが、スレッドが以前に接続されていなければ無駄になります。私の場合は、それは常に以前に添付されています。 –

関連する問題