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
- Android_app-> activity-> internalDataPath todavía NULL en 2.3.8 NDK r8
- Android NDK UnsatisfiedLinkError - una razón sorprendente
- Gifflen Señal Fatal 11
- C ++ ifstream.getline () significativamente más lento que BufferedReader.readLine () de Java?
- ¿Cuál es la regla que el sistema Android carga la biblioteca nativa (por lo que el archivo) de armeabi, armeabi-v7a, arm64-v8a?
¿Cómo puedo leer y escribir un archivo xml de NDK?
Se apreciarán todos los punteros.
- Uso de libxml para Android
- Actualizar una biblioteca nativa no funciona en Android
- Nexus One / Android "La CPU puede estar vinculada" bug
- LOCAL_LDLIBS vs. LOCAL_LDFLAGS
- Android-NDK-Añadir Native Support-NDK ubicación no válida en las preferencias
- Indic-text-renderer usando harfbuzz y freetype
- Tipo 'jint' no se pudo resolver, y JNIEnv, jclass
- Android JNI - Llamar AttachCurrentThread sin DetachCurrentThread
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 alarmManager setRepetición no desencadenar
- Cómo actualizar los servicios de Google Play en el emulador en Android Studio