我有一个用于从C调用的Java函数的JNI包装器...我试图从不同的线程调用一些方法,并且在尝试获取JNIEnv指针的新副本时出现错误...我正在使用的代码在下面,并在每种方法中调用:
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。
答案 0 :(得分:15)
请参阅章节Attaching to the VM
的{{3}}。
在使用任何JNI功能之前,您需要至少为每个本机线程调用AttachCurrentThread()
。
用Java创建的线程已经附加
所以每当GetEnv
调用失败时调用AttachCurrentThread()
,我都会举例说明你应该没问题。或者确保在创建子线程时将其附加到VM。