2011-11-10 63 views
6

我打电话从JavaActivity一个NativeActivity的。我NativeActivity的的切入点是NativeActivity的未完成

android_main(struct android_app* state) 

在这个月底,我叫

ANativeActivity_finish 

但是我的祖国活动只是挂起,而不是返回到Java的活动,被称为(它被称为简单地使用startActivity)。它似乎处于暂停状态。我可以得到它返回到前一个活动的唯一方法是通过我的android_main结束通话exit(0),然而,这杀死进程,并导致其他问题。

我怎样才能顺利退出我的NativeActivity的,并返回到调用它的JavaActivity?

+0

我不知道为什么这个问题没有得到回答,有没有谁需要打电话的人并不多NativeActivity来自(Java)Activity,并从它们返回? –

回答

6

我遇到了同样的问题。在主循环中调用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); 
    } 
    } 
} 

那么它是为时已晚,你我猜,但我花了这么多时间,因为我无法找到一个sultion所以我张贴在这里为大家谁运行到同样的问题。更多关于与分离和附加调用有关的其他棘手的东西可以在这里找到:Access Android APK Asset data directly in c++ without Asset Manager and copying

+0

我可以问在什么点在应用程序生命周期你设于靠近真的吗?在什么APP_STATE? – Dev2rights

+0

这发生在我的引擎的主循环。每当用户退出游戏,即在主菜单中按下后退按钮并且用户接受提示以关闭游戏时。所以这在任何特定的Android APP_STATE中都不会发生。但实际上,Closed = true只能在动画“状态”中发生,因为我在那里更新了我的偶数系统。 if(engine.animating){//动画内容} – odbb

2

最终工作对我来说,从应用程序(本机端)完成(一个)NativeActivity(的子类)的解决方案是调用java方法在UI线程上运行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(); 
      } 
     }); 
    } 
}