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

Dan*_*aum 4 c++ java-native-interface

我想知道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;
}
Run Code Online (Sandbox Code Playgroud)

是否有与呼叫相关的清理呼叫AttachCurrentThread()

另外,这是一个轻量级的功能吗?RetrieveJniEnvPtr()在同一个线程中多次调用(在此示例中)是标准编程实践- 还是代码只能JNIEnv *在线程的生命周期内检索一次?

use*_*421 6

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