11

我有一个用于从 C 调用的 Java 函数的 JNI 包装器......我试图从不同的线程调用一些方法,但在尝试获取 JNIEnv 指针的新副本时出现错误......我的代码m using is below 并在每个方法中调用:

        JNIEnv* GetJniEnvHandle(){
        ThreadInfo();
        JNIEnv *envLoc; 
        //if(Thread::CurrentThread->IsBackground || Thread::CurrentThread->IsThreadPoolThread)  
        jint envRes = vm->GetEnv((void**)&envLoc, JNI_VERSION_1_4);
        if(envRes == JNI_OK){
            if(ThreadId != Thread::CurrentThread->ManagedThreadId)
                jint res = vm->AttachCurrentThread((void**)&envLoc, NULL);
        }else{          
            Log("Error obtaining JNIEnv* handle");  
        }
        return envLoc;
    }

JVM 已经被实例化,并且这个(和其他方法)在从主/初始线程调用时运行。当我获得 envRes 的值时,它在子线程中为 -2。

4

1 回答 1

16

请参阅章节的文档Attaching to the VM

在使用任何 JNI 函数之前,您需要AttachCurrentThread()为每个本机线程调用至少一次。
在 Java 中创建的线程已经附加。
因此,每当GetEnv呼叫失败时,我都是您的示例AttachCurrentThread(),您应该没问题。或者确保在创建子线程时将其附加到 VM。

于 2012-04-25T11:39:39.200 回答