2012-04-25 19 views
10

Tengo un contenedor JNI para funciones Java que se llaman desde C ... Estoy intentando llamar a algunos métodos de diferentes hilos y me sale un error al intentar obtener una nueva copia del puntero JNIEnv ... el código que estoy usando es de abajo y es llamado en cada método:JNI - multi hilos

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

la JVM ya ha sido creada y esto (y otros métodos) se ejecutan cuando se llama desde el hilo principal/inicial. Cuando obtengo un valor para envRes tiene un -2 cuando está en un sub thread.

Respuesta

15

Consulte documentation en el capítulo Attaching to the VM.

Debe llamar al AttachCurrentThread() para cada hilo nativo al menos una vez antes de poder usar cualquiera de las funciones JNI.
El hilo creado en Java ya está adjunto.
Así que su ejemplo cada vez que la llamada GetEnv falla, llame al AttachCurrentThread() y debería estar bien. O asegúrese de que cuando cree un sub thread lo adjunte a la VM.

+0

eso fue todo - supervisión muy simple por mi parte jajaja. ¡Simplemente cambié el orden de las dos llamadas JNI y funciona perfectamente! ¡Gracias! – bbqchickenrobot