Sono molto nuovo a JNI e sto cercando di capire come funzionano certe cose prima di eseguire il porting del mio codice iOS C++. Ho avuto successo nell'ottenere uno degli esempi NDK che funzionano in Android Studio e posso vedere come Java sia in grado di chiamare le funzioni C++.NDK Android: chiamata alle funzioni Java da C++
Sono stato a cercare in giro e prendere pezzi di codice, ma non sono stato in grado di farlo funzionare nella mia specifica implementazione.
Solo per testare come funzionano le cose, ho impostato una semplice funzione di registro di testo in java, e sto provando a chiamarla dal mio codice nativo, ma ho riscontrato problemi.
Qui è la mia funzione di Java:
public static void log(String s){
Log.d("Native", s);
}
e C++:
void Log(std::string s){
JNIEnv *env;
g_JavaVM->GetEnv((void**)&env, JNI_VERSION_1_6);
jstring jstr1 = env->NewStringUTF(s.c_str());
jclass clazz = env->FindClass("com/android/gl2jni/GL2JNILib");
jmethodID mid = env->GetStaticMethodID(clazz, "log", "(Ljava/lang/String;)V");
jobject obj = env->CallStaticObjectMethod(clazz, mid, jstr1);
}
Da quello che ho visto con diversi esempi questo dovrebbe funzionare, ma genera un errore:
29835-29849/com.android.gl2jni A/libc﹕ Fatal signal 11 (SIGSEGV) at 0x00000000 (code=1), thread 29849 (Thread-17371)
Mi manca qualcosa?
EDIT:
ho cambiato a GetStaticMethodID. Ma dopo l'accesso il progresso della funzione che ho scoperto che la linea che non riesce è:
g_JavaVM->GetEnv((void**)&env, JNI_VERSION_1_6);
Che ho dato è perché g_JavaVM è impostato come static JavaVM* g_JavaVM = NULL;
e poi mai toccato di nuovo. Sto indovinando che ho bisogno di impostare questa variabile, ma come?
È possibile aggiungere __android_log_print (ANDROID_LOG_DEBUG, "myApp", "msg xxx") prima di ogni riga e scoprire quale causa causa SIGSEGV. –
Non ho testato il codice, ma dato che c'è una funzione 'GetStaticMethodID' nel' JNIEnv', mi azzarderei a pensare che la tua chiamata a 'GetMethodID' non possa trovare alcun metodo non statico che corrisponda alla tua firma e poi ritorni null, che non si riesce a verificare. – zenzelezz
Ho modificato del codice e aggiunto alcuni dettagli. – Bananable