Acceda al contexto de Android en la aplicación ndk

cppdev 12/15/2010. 2 answers, 7.899 views
android android android-ndk android-ndk

¿Hay alguna manera en que pueda pasar / obtener un objeto de contexto de 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 desde NDK?

Cualquier puntero será apreciado.

3 Comments
ognian 12/15/2010
Cómo leer y escribir el archivo xml: xmlsoft.org
Sebastian Roth 12/15/2010
Si bien no tengo experiencia con el NDK, no creo que puedas acceder al contexto. El desarrollo de NDK es solo para cosas de tiempo crítico, de alto rendimiento y de bajo nivel. Le sugiero que encuentre los datos de configuración más importantes que necesita y los escriba en JSON o XML y los analice desde su código NDK.
Mr.Cool 05/22/2013
@cppdev ahora también enfrento este mismo problema, si lo has implementado, ¿puedes compartirlo?

2 Answers


Lucas S. 12/22/2010.

No hay nada especial que tengas que hacer, es como el mecanismo JNI normal. Debe obtener un puntero al objeto de contexto, luego recuperar el ID del método que desea llamar y luego invocarlo con los argumentos que desee.

Por supuesto, en palabras suena muy sencillo, pero en el código se vuelve realmente complicado ya que todos los controles y llamadas JNI.

Entonces, en mi opinión, no intentaré implementar todo desde el código nativo / JNI, sino que implementaré un método de ayuda en Java que hace todo y solo recibe 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 no espere trabajar fuera de la caja.

2 comments
Igor Ganapolsky 04/12/2016
¿Qué es la variable env ? ¿Es un contexto para aprobar en Android?
1 aasu 09/08/2016
@IgorGanapolsky No es necesario pasar explícitamente como un argumento en la llamada a la función JNI porque la JVM lo pasa internamente. Ver en.wikipedia.org/wiki/Java_Native_Interface#How_the_JNI_work s

dev 02/16/2016.

Parece que las cosas han cambiado recientemente y la solución anterior y algunas otras publicadas en otras publicaciones de SO no me funcionaron. Después de algunos intentos, pude hacer el siguiente trabajo de solución. Mi objetivo era pasar Context Object a JNI y obtener una ruta de almacenamiento absoluta.

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;
      }
} 
1 comments
Igor Ganapolsky 04/12/2016
Pensé que los argumentos van en la última posición en la lista de parámetros para GetMethodID acuerdo con journals.ecs.soton.ac.uk/java/tutorial/native1.1/implementin g / .... Sin embargo, ¿está pasando contextClass como el primer parámetro?

Related questions

Hot questions

Language

Popular Tags