我的应用程序在C语言中编写了99%,只有一些Java助手函数用于NDK中没有的东西。作为文件选择器,我正在使用ListActivity,我从Java端开始这样做:
Intent myIntent = new Intent(this, FileChooser.class);
startActivity(myIntent);
当此ListActivity正在运行时,我的NDK线程等待用户选择文件并使用
关闭ListActivityALooper_pollAll();
每当一个事件唤醒我的NDK线程时,我就会使用JNI调用Java端来检查一个标志,该标志指示ListActivity是否仍处于打开状态或已被用户关闭。在我的ListActivity的onDestroy()方法中,我有以下代码:
@Override
protected void onDestroy() {
super.onDestroy();
if(isFinishing()) listActivityDone = true;
}
现在我的问题是,当用户按下ListActivity中的BACK按钮时,我的NDK线程被正确唤醒但不幸的是,在我的NDK线程被唤醒后,onDestroy()被称为,因此我的NDK线程没有获得标志“listActivityDone”的正确值。当我的NDK线程被唤醒时,“listActivityDone”仍为FALSE,因为在我的NDK线程被唤醒后立即调用onDestroy()。
因此,解决此问题需要做的是在将标志“listActivityDone”设置为TRUE后再次唤醒NDK线程。有人知道如何实现这一目标吗?
当然,我可以从Java调用C函数然后调用ALooper_wake(),但我几乎可以肯定有一个更好的版本可以从Java端唤醒NDK线程。有什么想法吗?
感谢您的帮助!
答案 0 :(得分:0)
也许你可以将你的旗帜移动到onPause,onResume:
@Override
protected void onPause() {
super.onPause();
if(isFinishing()) listActivityDone = true;
}
@Override
protected void onResume() {
super.onResume();
if(!isFinishing()) listActivityDone = false;
}
这样就可以提前调用。如果onPause不适用于您的特定场景,您也可以考虑将其置于onStop
答案 1 :(得分:0)
您能否正好处理APP_CMD_TERM_WINDOW
命令才能正常关闭?