Acceso al contexto android en la aplicación ndk

¿Hay alguna manera en la que puedo pasar / obtener un objeto de contexto android en mi aplicación ndk. Quiero usar SharedPreferences en mi aplicación ndk a través de la interfaz jni. Para obtener una instancia del objeto SharedPreferences , necesito llamar a getSharedPreferences() en el objeto Context . Pero no tengo acceso al objeto de contexto.

O

¿Cómo puedo leer y escribir un archivo xml de NDK?

Se apreciarán todos los punteros.

No hay nada especial que usted tiene que hacer, es apenas como mecanismo regular de JNI. Necesita obtener un puntero al objeto de contexto, luego recuperar el ID del método que desea llamar y luego invocarlo con los args que desea.

Por supuesto en palabras suena súper directo, pero en el código se pone realmente desordenado ya que todos los cheques y llamadas JNI.

Así que en mi opinión no intentaré implementar todo el código nativo / JNI, en lugar de eso implementaré un método auxiliar en Java que haga todas las cosas y solo reciba los datos necesarios para leer / escribir la preferencia.

Eso simplificará mucho su código nativo y lo hará más fácil de mantener.

p.ej:

 //Somewhere inside a function in your native code void Java_com_example_native_MainActivity_nativeFunction(JNIEnv* env, jobject thiz) { jclass cls = (*env)->FindClass(env,"PreferenceHelper"); if (cls == 0) printf("Sorry, I can't find the class"); jmethodID set_preference_method_id; if(cls != NULL) { set_preference_method_id = (*env)->GetStaticMethodID(env, cls, "setPreference", "(Ljava/lang/String;Ljava/lang/StringV"); if(set_preference_method_id != NULL ) { jstring preference_name = (*env)->NewStringUTF(env, "some_preference_name"); jstring value = (*env)->NewStringUTF(env, "value_for_preference"); (*env)->CallStaticVoidMethod(env, cls, get_main_id, preference_name, value); } } } 

Tenga en cuenta que acabo de escribir el código de la memoria así que espero no trabajar fuera de la caja.

Parece que las cosas han cambiado recientemente y la solución anterior y pocos otros publicados en otras publicaciones SO no funcionó para mí. Después de unos pocos intentos, pude hacer el siguiente trabajo de solución. Mi objetivo era pasar Context Object a JNI y obtener un camino de almacenamiento absoluto.

 void Java_com_path_to_my_class_jniInit(JNIEnv* env, jobject thiz, jobject contextObject) { try { //Get Context Class descriptor jclass contextClass = env->FindClass("android/content/Context"); //Get methodId from Context class jmethodID getFilesDirMethodId = env->GetMethodID(contextClass,"getFilesDir","()Ljava/io/File;"); //Call method on Context object which is passed in jobject fileObject = env->CallObjectMethod(contextObject,getFilesDirMethodId); //Get File class descriptor jclass fileClass = env->FindClass("java/io/File"); //Get handle to the method that is to be called jmethodID absolutePathMethodId = env->GetMethodID(fileClass,"getAbsolutePath","()Ljava/lang/String;"); //Call the method using fileObject jstring stringObject = (jstring)env->CallObjectMethod(fileObject,absolutePathMethodId); } catch(exception& ex){ JNIExceptionHelper::throwException(env, ex.what()); return; } } 
  • Android: construye APKs separados para diferentes arquitecturas de procesador
  • Cómo obtener el tiempo de computación en NDK
  • Crash al cerrar el teclado virtual mientras utiliza la actividad nativa
  • Android NDK Exception failed: dlopen failed: no se puede localizar el símbolo "_ZN7Tangram11setPositionEdd" referenciado por "libtangram.so"
  • ¿Cuál es la diferencia entre la cadena de herramientas ndk r9 legacy de android y android ndk r9 en windows 64
  • La ejecución falló para la tarea ': app: compileDebugNdk' al intentar compilar el proyecto de Android Studio con código fuente NDK
  • UnsatisfiedLinkError: No se pudo cargar X desde el cargador
  • Cómo invocar mi decodificador personalizado en el código fuente de Android
  • Cómo depurar SEGV_ACCERR
  • ¿Es posible ejecutar un binario de brazo nativo en un teléfono Android no enraizado?
  • ¿Alguien ha construido ZBar usando el Android NDK?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.