2013-08-05 3 views
7

मैं एक प्रोजेक्ट पर काम कर रहा हूं, जहां मैं सी ++ कोड (जेएनआई का उपयोग करके) जावा कार्यों को कॉल करता हूं और मुझे मल्टीथ्रेडिंग के बारे में समस्या है। मैं जावा खोज फ़ंक्शन को कॉल करना चाहता हूं और प्रत्येक कॉल के लिए मैं एक अलग थ्रेड बनाना चाहता हूं। मेरे पास सिंगलटन MainClass और नेस्टेड Query कक्षा है। Query कक्षा QThread से विरासत में मिली है। कोड इसजेएनआई कई धागे के साथ सी ++ से जावा को कॉल कर रहा है

MainClass::MyQuery query("<some search query>"); 
query.LaunchQuery(); 


//functions of Query 
void MainClass::MyQuery::LaunchQuery() const 
{ 
    this->start(); 
} 

void MainClass::Query::run() 
{ 
    const MainClass& mainClass = MainClass::GetInstance(); 
    const jclass& obj = mainClass.GetClass(); 
    JNIEnv& env = mainClass.GetJavaEnvironment(); 
    jmethodID methodId = env.GetMethodID(obj, "SearchQuery", "(Ljava/lang/String;)V"); //Run-time error 

    if(methodId != 0) 
    { 
     //calling "SearchQuery" function 
    } 

तरह लग रहा है अब, अगर एकल थ्रेड में इस कोड को चलाने के - सब कुछ ठीक है, लेकिन अगर कोड ऊपर चलाने का प्रयास - multithreading का उपयोग, यह संदेश "Unhandled exception at 0x777715de in MyApp.exe: 0xC0000005: Access violation reading location 0x000000ac." जब मैं कोशिश से रन-टाइम त्रुटि होती है विधि आईडी प्राप्त करने के लिए। मैंने boost::thread के साथ भी कोशिश की है लेकिन परिणाम वही था।

तो जब मैं इसे एक अलग धागे में कर रहा हूं तो यह विफल क्यों होता है, जब एक ही धागे में सब ठीक है? कोई विचार?

उत्तर

8

JNI डॉक्स में 'वी एम को अटैच किया जा रहा' करने के लिए नीचे स्क्रॉल:

http://docs.oracle.com/javase/1.5.0/docs/guide/jni/spec/invocation.html

JNI इंटरफ़ेस सूचक (JNIEnv) केवल वर्तमान सूत्र में मान्य है। अगर किसी अन्य धागे को जावा वीएम तक पहुंचने की ज़रूरत है, तो उसे को पहले VM से संलग्न करने के लिए AttachCurrentThread() को कॉल करना होगा और एक जेएनआई इंटरफ़ेस पॉइंटर प्राप्त करना होगा।

+0

और मैं इस http://stackoverflow.com/questions/12900695/how-to-obtain-jni-interface-pointer-jnienv-for-asynchronous-calls के लिए एक उदाहरण जोड़ूंगा – nabroyan

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