मैं एक प्रोजेक्ट पर काम कर रहा हूं, जहां मैं सी ++ कोड (जेएनआई का उपयोग करके) जावा कार्यों को कॉल करता हूं और मुझे मल्टीथ्रेडिंग के बारे में समस्या है। मैं जावा खोज फ़ंक्शन को कॉल करना चाहता हूं और प्रत्येक कॉल के लिए मैं एक अलग थ्रेड बनाना चाहता हूं। मेरे पास सिंगलटन 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
के साथ भी कोशिश की है लेकिन परिणाम वही था।
तो जब मैं इसे एक अलग धागे में कर रहा हूं तो यह विफल क्यों होता है, जब एक ही धागे में सब ठीक है? कोई विचार?
और मैं इस http://stackoverflow.com/questions/12900695/how-to-obtain-jni-interface-pointer-jnienv-for-asynchronous-calls के लिए एक उदाहरण जोड़ूंगा – nabroyan