7

JavaActivity から NativeActivity を呼び出します。私のNativeActivityのエントリポイントは

 android_main(struct android_app* state)

これの終わりに、私は電話します

 ANativeActivity_finish

ただし、ネイティブ アクティビティは、それを呼び出した Java アクティビティに戻るのではなく、ハングするだけです (単に を使用して呼び出されましたstartActivity)。休止状態のようです。前のアクティビティに戻す唯一の方法exit(0)は、android_main の最後で呼び出すことですが、これによりプロセスが強制終了され、他の問題が発生します。

NativeActivity を正常に終了し、それを呼び出した JavaActivity に戻るにはどうすればよいですか?

4

2 に答える 2

8

私は同じ問題に遭遇します。ANativeActivity_finish(..) がメインループで呼び出されたときに基本的に機能します。これは、状態を無効にし、 static void android_app_destroy(struct android_app で ANativeActivity_finish(..) を呼び出した後に state->destroyRequested を 1 に設定することでアプリ自体を終了するためです。 * android_app) (android_native_app_glue.c C:173)。

void android_main(struct android_app* state) 
{
  // Attach current state if needed
  state->activity->vm->AttachCurrentThread(&state->activity->env, NULL);
  ...
  // our main loop for the app. Will only return once the game is really finished.
  while (true) {
    ...
    while ((ident=ALooper_pollAll(engine.animating ? 0 : -1, NULL, &events,(void**)&source)) >= 0) {
      ...
      // Check if we are exiting. Which is the case once we called ANativeActivity_finish(state->activity);
      if (state->destroyRequested != 0) 
      {
         // Quit our app stuff herehere
         // detatch from current thread (if we have attached in the beginning)
         state->activity->vm->DetachCurrentThread();
         // return the main, so we get back to our java activity which calle the nativeactivity
         return;
      }
    }
    if (engine.animating) 
    {
      // animation stuff here
    }
    // if our app told us to finish
    if(Closed)
    {
      ANativeActivity_finish(state->activity);
    }
  }
}

あなたには遅すぎると思いますが、問題が見つからなかったので多くの時間を費やしたので、同じ問題に遭遇したすべての人のためにここに投稿します. detach および attach 呼び出しに関連するその他のトリッキーな内容については、こちらを参照してください。Asset Manager やコピーを使用せずに、C++ で直接 Android APK アセット データにアクセスします。

于 2012-04-21T22:08:59.620 に答える
4

アプリ(ネイティブ側)から(aのサブクラス)を完成させるために最終的に機能した解決策は、UIスレッドNativeActivityで実行されるJavaメソッドを呼び出すことでした。finish()

C/C++ 側:

...

jmethodID FinishHim = jni->GetMethodID(activityClass, "FinishMe", "()V");
jni->CallVoidMethod(state->activity->clazz, FinishHim);

Java 側:

public class CustomNativeActivity extends NativeActivity {

    ...

    public void FinishMe() {
        this.runOnUiThread(new Runnable() {
            public void run() {
                finish();
            }
        });
    }
}
于 2012-06-08T08:51:54.080 に答える