2012-10-11 23 views
9

Mi aplicación de Android compila dos actividades: ".MainActivity" y "android.app.NativeActivity". Este último se implementa puramente en C++. En el botón de clic en ".MainActivity" Comienzo una nativa tratando de pasar algunos parámetros:Parámetro de pase de Android a Actividad nativa

public void pressedButton(View view) 
{ 
    Intent intent = new Intent(this, android.app.NativeActivity.class); 
    intent.putExtra("MY_PARAM_1", 123); 
    intent.putExtra("MY_PARAM_2", 321); 
    startActivity(intent); 
} 

¿Cómo llego MY_PARAM_1 y MY_PARAM_2 desde dentro del punto de entrada android.app.NativeActivity (que es una función de C-void android_main(struct android_app* state))?

Respuesta

12

En la estructura android_app hay un miembro de datos llamado activity del tipo ANativeActivity*. Dentro de este último, hay un JavaVM *vm y engañosamente llamado jobject clazz. El clazz es en realidad un puntero de instancia de objeto compatible con JNI para un objeto Java del tipo android.app.NativeActivity, que tiene todos los métodos Activity, incluido getIntent(). También hay un JNIEnv, pero parece que no está conectado al hilo principal de la actividad.

Usa las invocaciones JNI para recuperar el intento, luego los extras del intento. Esto es así:

JNIEnv *env; 
state->activity->vm->AttachCurrentThread(&env, 0); 

jobject me = state->activity->clazz; 

jclass acl = env->GetObjectClass(me); //class pointer of NativeActivity 
jmethodID giid = env->GetMethodID(acl, "getIntent", "()Landroid/content/Intent;"); 
jobject intent = env->CallObjectMethod(me, giid); //Got our intent 

jclass icl = env->GetObjectClass(intent); //class pointer of Intent 
jmethodID gseid = env->GetMethodID(icl, "getStringExtra", "(Ljava/lang/String;)Ljava/lang/String;"); 

jstring jsParam1 = env->CallObjectMethod(intent, gseid, env->NewStringUTF("MY_PARAM_1")); 
const char *Param1 = env->GetStringUTFChars(jsParam1, 0); 
//When done with it, or when you've made a copy 
env->ReleaseStringUTFChars(jsParam1, Param1); 

//Same for Param2 
+0

Gracias. Pero me ha surgido otra pregunta poco clara: ¿puedo usar 'state-> activity-> env' como está, o tengo que adquirirlo usando' state-> activity-> vm-> AttachCurrentThread (& env, 0); ' ? – Nick

+0

Hm ... Estoy mirando el código de inicio de la secuencia (en android_native_app_glue.c), y parece que no está adjuntado a la secuencia de actividad nativa. Así que sí, debes unir una JVM al hilo primero en lugar de usar 'env'. Editado la respuesta. –

Cuestiones relacionadas