2012-10-11 5 views
9

私のアンドロイドアプリケーションは2つのアクティビティをコンパイルします: ".MainActivity"と "android.app.NativeActivity"。後者は純粋にC++で実装されています。 「.MainActivity」のボタンクリックで、私はいくつかのパラメータを渡すしようとしているネイティブの1を起動します。Androidのパラメータをネイティブアクティビティに渡す

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-機能void android_main(struct android_app* state)です(android.app.NativeActivityのエントリポイント内からMY_PARAM_1とMY_PARAM_2を得るのですか)?

答えて

12

android_app構造には、ANativeActivity*というactivityというデータメンバーがあります。後者には、JavaVM *vmがあり、誤解を招くようにjobject clazzと呼ばれています。 clazzは、実際にはandroid.app.NativeActivityのJavaオブジェクトへのJNI準拠のオブジェクトインスタンスポインタであり、getIntent()を含むActivityのすべてのメソッドを持ちます。

そこには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 = 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

ありがとうございます。しかし、別の質問が私にはっきりしています: 'state-> activity-> env'をそのまま使うか、' state-> activity-> vm-> AttachCurrentThread(&env、0); ' ? – Nick

+0

Hm ...(android_native_app_glue.cの)スレッドスタートアップコードを見ていて、ネイティブのアクティビティスレッドにアタッチされていないようです。ですから、 'env'を使うのではなく、最初にスレッドにJVMを付ける必要があります。答えを編集しました。 –

関連する問題