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(..) 时对我有用,因为它使状态无效并通过在静态 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);
    }
  }
}

好吧,我想对你来说已经太晚了,但是我花了很多时间在上面,因为我找不到一个 sultion 所以我把它贴在这里给遇到同样问题的每个人。可以在此处找到有关与分离和附加调用相关的其他棘手内容的更多信息:Access Android APK Asset data directly in c++ without Asset Manager and copying

于 2012-04-21T22:08:59.620 回答
4

最终让我从应用程序(本机端)完成一个(a 的子类)的解决方案NativeActivity是调用finish()在 UI 线程上运行的 java 方法。

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 回答