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?
E aggiungerò un esempio per questo http://stackoverflow.com/questions/12900695/how-to-obtain-jni-interface-pointer-jnienv-for-asynchronous-calls – nabroyan