在JNI中,是否有从AttachCurrentThread()返回的JNIEnv指针的清理函数?

时间:2012-04-28 18:15:06

标签: c++ java-native-interface

我想知道从JNI函数JNIEnv *获得的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 个答案:

答案 0 :(得分:6)

清理功能为DetachCurrentThread()。您需要构建代码,以便知道您是否在现有的Java线程中,在这种情况下,您已经将JNIEnv*传递到JNI方法中,或者您已经在您自己设计的本机主题,在这种情况下,您必须在任何其他JNI呼叫之前呼叫AttachCurrentThread(),之后再DetachCurrentThread()。不要试图隐瞒这一要求。