Chcę wywołać metody klasy Java z pliku cpp, który odbiera wywołania zwrotne z innego pliku wykonywalnego.Udostępnianie JavaVM * dla wątków w systemie Android NDK
W tym celu pobrałem wskaźnik JavaVM za pomocą metody android :: AndroidRuntime :: getJavaVM() w pliku .cpp, który bezpośrednio odbiera wywołania metod JNI. Dzielę ten wskaźnik javavm przez konstruktora do ostatecznego pliku .cpp gdzie ja nazywam wymaganej metody Java w następujący sposób:
/* 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");**
Jednak dostaję SIGSEGV usterkę działa ten kod.
Zgodnie z dokumentacją JNI to wydaje się być odpowiednim sposobem na uzyskanie JNIEnv w kontekstach arbitralne: http://java.sun.com/docs/books/jni/html/other.html#26206
Każda pomoc w tym zakresie zostaną docenione.
Pozdrowienia, Neeraj
Co to jest Android :: AndroidRuntime :: getJavaVM)? To nie jest funkcja publicznego interfejsu NDK. Używasz czegoś nieudokumentowanego. Aby uzyskać JavaVM * w NDK, musisz implementować globalną funkcję JNI_OnLoad, która jest automatycznie wywoływana po załadowaniu biblioteki współdzielonej. –
Dziękuję za odpowiedź .. http://android.wooyd.org/JNIExample/#NWD1sCYeT-J - ten dokument zawiera bardzo dobre intro do JNI_OnLoad, gdzie używany jest android :: AndroidRuntime :: registerNativeMethods(). Czy na pewno Android :: AndroidRuntime nie jest udokumentowany? – Neeraj
Tak, to nieudokumentowana funkcja w normalnym kodzie NDK użytkownika. Przeczytaj dokumentację JNI (od firmy Sun) i sprawdź plik docs/STABLE-APIS.html w swoim folderze NDK, aby uzyskać dostęp do legalnego i udokumentowanego interfejsu API. –