Quiero llamar a los métodos de clase Java desde un archivo cpp que recibe llamadas de otro ejecutable.Compartir un JavaVM * entre hilos en Android NDK
Para lograr esto, se han recuperado un puntero JavaVM utilizando el androide Android Runtime :: :: getJavaVM método() en el archivo .cpp que recibe directamente el método JNI llamadas. Estoy compartiendo este puntero JavaVM a través del constructor para el archivo .cpp eventual donde yo llamo requieren métodos de Java de la siguiente manera:
/* 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");**
Sin embargo, me sale un error de SIGSEGV ejecutar este código.
De acuerdo con la documentación JNI esto parece ser la forma apropiada para obtener JNIEnv en contextos arbitrarios: http://java.sun.com/docs/books/jni/html/other.html#26206
será apreciado Cualquier ayuda en este sentido.
Saludos, Neeraj
¿Qué es android :: AndroidRuntime :: getJavaVM)? Esa no es la función de API pública de NDK. Estás usando algo no documentado. Para obtener JavaVM * en NDK, debe implementar la función global JNI_OnLoad que se llama automáticamente cuando se carga su biblioteca compartida. –
Gracias por su respuesta .. http://android.wooyd.org/JNIExample/#NWD1sCYeT-J - este documento ofrece una muy buena introducción a JNI_OnLoad, donde se usa android :: AndroidRuntime :: registerNativeMethods(). ¿Estás seguro de que android :: AndroidRuntime no está documentado? – Neeraj
Sí, es una característica no documentada en el código NDK de usuario normal. Lea la documentación de JNI (desde Sun) y verifique el archivo docs/STABLE-APIS.html en su carpeta NDK para obtener otra API legal y documentada. –