JNI - 多线程

时间:2012-04-25 11:25:54

标签: java c++ multithreading java-native-interface

我有一个用于从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。

1 个答案:

答案 0 :(得分:15)

请参阅章节Attaching to the VM的{​​{3}}。

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