12

私の Android アプリケーションは、「.MainActivity」と「android.app.NativeActivity」の 2 つのアクティビティを構成しています。後者は純粋に 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 関数) 内から MY_PARAM_1 と MY_PARAM_2 を取得するにはどうすればよいvoid android_main(struct android_app* state)ですか?

4

1 に答える 1

16

構造体には、 typeandroid_appというデータ メンバーがあります。後者の内部には、誤解を招くように呼ばれる a と aがあります。は、実際には を含むすべてのメソッドを持つ型の Java オブジェクトへの JNI 準拠のオブジェクト インスタンス ポインタです。activityANativeActivity*JavaVM *vmjobject clazzclazzandroid.app.NativeActivityActivitygetIntent()

そこ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
于 2012-10-11T14:37:05.697 に答える