【问题标题】:Android pass parameter to Native ActivityAndroid将参数传递给Native Activity
【发布时间】:2012-10-02 05:12:12
【问题描述】:

我的 android 应用程序包含两个活动:“.MainActivity”和“android.app.NativeActivity”。后者纯粹用 C++ 实现。在“.MainActivity”中单击按钮时,我启动了一个尝试传递一些参数的本地程序:

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);
}

如何从 android.app.NativeActivity 的入口点(即 C 函数 void android_main(struct android_app* state))中获取 MY_PARAM_1 和 MY_PARAM_2?

【问题讨论】:

    标签: android android-ndk native-activity


    【解决方案1】:

    android_app 结构中有一个名为activity 的数据成员ANativeActivity*。在后者内部,有一个JavaVM *vm 和一个误导性地称为jobject clazzclazz实际上是一个符合JNI的对象实例指针,指向android.app.NativeActivity类型的Java对象,它具有所有Activity方法,包括getIntent()

    那里也有一个JNIEnv,但看起来它没有附加到活动的主线程。

    使用 JNI 调用来检索意图,然后从意图中获取额外内容。它是这样的:

    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 = (jstring)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
    

    【讨论】:

    • 谢谢。但它提出了另一个我不清楚的问题:我可以按原样使用state->activity->env,还是让我使用state->activity->vm->AttachCurrentThread(&env, 0); 获取它?
    • 嗯...我正在查看线程启动代码(在 android_native_app_glue.c 中),看起来它没有附加到本机活动线程。所以,是的,您必须先将 JVM 附加到线程,而不是使用 env。编辑了答案。
    猜你喜欢
    • 2012-04-14
    • 1970-01-01
    • 1970-01-01
    • 2015-08-15
    • 1970-01-01
    • 1970-01-01
    • 2013-11-04
    • 2017-02-13
    • 2011-07-24
    相关资源
    最近更新 更多