2012-04-25 11 views
10

मेरे पास जावा कार्यों के लिए जेएनआई रैपर है जिसे सी से कहा जाता है ... मैं विभिन्न धागे से कुछ तरीकों को कॉल करने की कोशिश कर रहा हूं और जेएनआईएनवी पॉइंटर की एक नई प्रति प्राप्त करने का प्रयास करते समय मुझे एक त्रुटि मिलती है ... कोड मैं उपयोग कर रहा हूँ नीचे है और प्रत्येक विधि में कहा जाता है:जेएनआई - बहु धागे

 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 पहले से ही instantiated किया गया है और यह (और अन्य तरीकों) जब मुख्य/प्रारंभिक धागे से बुलाया जा रहा है चलाते हैं। जब मुझे envRes के लिए कोई मान मिलता है तो यह एक उप-धागे में एक -2 रखता है।

उत्तर

15

अध्याय Attaching to the VM पर documentation देखें।

किसी भी जेएनआई कार्यों का उपयोग करने से पहले आपको प्रत्येक देशी धागे के लिए AttachCurrentThread() पर कॉल करने की आवश्यकता है।
जावा में बनाए गए थ्रेड पहले ही संलग्न हैं।
तो मैं आपका उदाहरण जब भी GetEnv कॉल AttachCurrentThread() पर कॉल विफल रहता है और आपको ठीक होना चाहिए। या सुनिश्चित करें कि जब भी आप एक उप थ्रेड बनाते हैं तो आप उसे वीएम से जोड़ते हैं।

+0

यह था - मेरे भाग पर बहुत सरल निरीक्षण। बस दो जेएनआई कॉल के आदेश को बदल दिया और यह पूरी तरह से काम करता है! धन्यवाद! – bbqchickenrobot

संबंधित मुद्दे