JNI - многопоточность

У меня есть оболочка JNI для функций Java, вызываемых из C... Я пытаюсь вызвать некоторые методы из разных потоков, и я получаю сообщение об ошибке при попытке получить новую копию указателя 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

Обратитесь к документации к главе Attaching to the VM.

Вам нужно позвонить AttachCurrentThread() для каждого собственного потока хотя бы один раз, прежде чем вы сможете использовать любую из функций JNI.
Тема, созданная на Java, уже прикреплена.
Поэтому я ваш пример, когда вызов GetEnv завершает вызов AttachCurrentThread(), и все должно быть в порядке. Или убедитесь, что когда вы создаете дополнительный поток, вы присоединяете его к виртуальной машине.