저는 C++ 코드 (JNI 사용)에서 Java 함수를 호출하고 멀티 스레딩 문제가있는 프로젝트에서 작업하고 있습니다. Java 검색 기능을 호출하고 각 호출마다 별도의 스레드를 만들고 싶습니다. 싱글 톤 MainClass
및 중첩 된 Query
클래스가 있습니다. Query
클래스는 QThread
에서 상속됩니다. 코드 지금이다중 스레드로 C++에서 Java를 호출하는 JNI
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
}
처럼 보이는, 단일 스레드에서이 코드를 실행하면 - 모든 괜찮지 만, 위의 코드를 실행하려고하면 - 멀티 스레딩을 사용하여, 내가 시도 메시지 "Unhandled exception at 0x777715de in MyApp.exe: 0xC0000005: Access violation reading location 0x000000ac."
에 의해 런타임 오류가 발생합니다 메서드 ID를 얻으려면. boost::thread
도 시도했지만 결과는 동일합니다.
그래서 내가 왜 다른 스레드에서 작업을 수행 할 때 동일한 스레드에서 모든 것이 정상적으로 작동합니까? 아이디어가 있으십니까? 아래로 JNI의 문서에서 'VM에 연결'에
예를 들어 http://stackoverflow.com/questions/12900695/how-to-obtain-jni-interface-pointer-jnienv-for-asynchronous-calls을 추가하겠습니다. – nabroyan