JNI – 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; } 

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

请参阅Attaching to the VM一章的文档 。

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