JNI - 多线程

bbq*_*bot 11 c++ java java-native-interface multithreading

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

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

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

mka*_*aes 16

请参阅本章的文档Attaching to the VM.

AttachCurrentThread()在使用任何JNI函数之前,您需要至少调用一次本机线程.
用Java创建的线程已经附加.
所以,只要GetEnv呼叫失败,我就是你的例子AttachCurrentThread().你应该没事.或者确保在创建子线程时将其附加到VM.