我从JavaActivity调用NativeActivity。我的NativeActivity的入口点是
android_main(struct android_app* state)
最后,我打电话给
ANativeActivity_finish
但是我的本机活动只是挂起,而不是返回调用它的Java Activity(它只是使用startActivity
调用)。好像它处于暂停状态。我可以让它返回到上一个活动的唯一方法是在我的android_main末尾调用exit(0)
,但是这会导致进程失败并导致其他问题。
如何成功退出NativeActivity并返回调用它的JavaActivity?
答案 0 :(得分:7)
我遇到了同样的问题。基本上,当在主循环中调用ANativeActivity_finish(..)时,它对我有用,因为它在静态无效android_app_destroy(struct)中调用ANativeActivity_finish(..)后,通过将state-> destroyRequested设置为1来使状态无效并完成应用程序本身android_app * 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);
}
}
}
我觉得现在为时已晚,但我花了很多时间在上面,因为我找不到闷热,所以我在这里发布给遇到同样问题的每个人。有关分离和附加调用的其他棘手内容的更多信息,请访问:Access Android APK Asset data directly in c++ without Asset Manager and copying
答案 1 :(得分:2)
最终有效的解决方案是从app(本机端)完成(a)NativeActivity
的子类是在UI线程上运行finish()
的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();
}
});
}
}