2013-08-05 6 views
7

저는 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에 연결'에

답변

8

스크롤 :

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

JNI 인터페이스 포인터 (JNIEnv의) - 현재 스레드에서 유효합니다. 다른 thread가 Java VM에 액세스 할 필요가있는 경우는, AttachCurrentThread()를 호출 해, VM에 자기 자신을 부가 해, JNI 인터페이스 포인터를 취득 할 필요가 있습니다.

+0

예를 들어 http://stackoverflow.com/questions/12900695/how-to-obtain-jni-interface-pointer-jnienv-for-asynchronous-calls을 추가하겠습니다. – nabroyan