Desidero chiamare i metodi di classe Java da un file cpp che riceve le richiamate da un altro eseguibile.Condivisione di JavaVM * attraverso thread in NDK Android
Per ottenere ciò, ho recuperato un puntatore JavaVM utilizzando il metodo android :: AndroidRuntime :: getJavaVM() nel file cpp che riceve direttamente le chiamate al metodo JNI. Sto condividendo questo puntatore JavaVM tramite il costruttore per il file cpp eventuale dove ho chiamata richiesta metodi Java come segue:
/* All the required objects(JNIEnv*,jclass,jmethodID,etc) are appropriately declared. */
**JNIEnv* env;
jvm->AttachCurrentThread(&env, NULL);
clazz = env->FindClass("com/skype/ref/NativeCodeCaller");
readFromAudioRecord = env->GetStaticMethodID(clazz, "readFromAudioRecord", "([B)I");
writeToAudioTrack = env->GetStaticMethodID(clazz, "writeToAudioTrack", "([B)I");**
Tuttavia, ottengo un errore SIGSEGV l'esecuzione di questo codice.
Secondo la documentazione JNI questo sembra essere il modo appropriato per ottenere MEnv in contesti arbitrari: http://java.sun.com/docs/books/jni/html/other.html#26206
Qualsiasi aiuto in questo senso sarà apprezzato.
saluti, Neeraj
Che cos'è android :: AndroidRuntime :: getJavaVM)? Questa non è la funzione API pubblica NDK. Stai usando qualcosa di non documentato. Per ottenere JavaVM * in NDK devi impiantare la funzione globale JNI_OnLoad che viene chiamata automaticamente quando viene caricata la tua libreria condivisa. –
Grazie per la tua risposta .. http://android.wooyd.org/JNIExample/#NWD1sCYeT-J - questo documento fornisce un'ottima intro a JNI_OnLoad, dove viene utilizzato android :: AndroidRuntime :: registerNativeMethods(). Sei sicuro che Android :: AndroidRuntime non sia documentato? – Neeraj
Sì, funzione non documentata nel normale codice utente NDK. Leggi la documentazione JNI (da Sun) e controlla il file docs/STABLE-APIS.html nella tua cartella NDK per altre API legali e documentate. –