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 *在线程的生命周期内检索一次?

4

1 回答 1

6

清理功能是DetachCurrentThread()。您需要构造您的代码,以便您知道您是否在现有的 Java 线程中,在这种情况下,您已经将JNIEnv*传递到您的 JNI 方法中,或者您在自己设计的本机线程中,在这种情况下,您必须AttachCurrentThread()在任何其他 JNI 调用之前和DetachCurrentThread()之后调用。不要试图逃避这个要求。

于 2012-04-30T10:09:59.127 回答