4

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

4

1 に答える 1

6

クリーンアップ機能はDetachCurrentThread(). 既存の Java スレッドにいるか (JNI メソッドに既に渡さJNIEnv*ているか)、または独自に考案したネイティブ スレッドにいるか (この場合は、AttachCurrentThread()他の JNI 呼び出しの前と後でDetachCurrentThread()呼び出す必要があります。この要件から隠れようとしないでください。

于 2012-04-30T10:09:59.127 に答える