2013-08-05 17 views
7

Sto lavorando a un progetto, dove chiamo le funzioni Java dal codice C++ (utilizzando JNI) e ho un problema con il multithreading. Voglio chiamare la funzione di ricerca Java e per ogni chiamata voglio fare un thread separato. Ho un singleton MainClass e classe nidificata Query. La classe Query viene ereditata da QThread. Codice assomiglia a questoJNI che chiama Java da C++ con più thread

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 
    } 

Ora, se eseguire questo codice in un unico filo - tutto va bene, ma se tenta di eseguire sopra il codice - utilizzando il multithreading, che provoca l'errore di run-time dal messaggio "Unhandled exception at 0x777715de in MyApp.exe: 0xC0000005: Access violation reading location 0x000000ac." quando provo per ottenere l'id del metodo. Ho provato anche con boost::thread ma il risultato è stato lo stesso.

Quindi, perché non riesce quando lo faccio in un thread separato, quando nello stesso thread va tutto bene? Qualche idea?

risposta

8

Scorrere 'Collegamento alla VM' nella documentazione JNI:

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

Il puntatore dell'interfaccia JNI (MEnv) è valido solo nella corrente thread. Se un altro thread deve accedere alla Java VM, è necessario che chiami prima AttachCurrentThread() per collegarsi alla VM e ottenere un puntatore all'interfaccia JNI.

+0

E aggiungerò un esempio per questo http://stackoverflow.com/questions/12900695/how-to-obtain-jni-interface-pointer-jnienv-for-asynchronous-calls – nabroyan

Problemi correlati