我的应用程序在C中只有99%的写入,只有一些Java帮助函数用于NDK中不可用的功能。作为一个文件选择器,我使用我开始喜欢这个从Java侧的ListActivity:虽然这ListActivity运行来自Java的用信号发送NDK线程
Intent myIntent = new Intent(this, FileChooser.class);
startActivity(myIntent);
,我NDK线程等待用户选择文件并关闭ListActivity使用
ALooper_pollAll();
每当一个事件唤醒我的NDK线程,我打电话使用JNI来检查一个标志,指示是否ListActivity仍然是开放的或已经被用户关闭Java端。在我ListActivity的的onDestroy()方法,我有以下代码:
@Override
protected void onDestroy() {
super.onDestroy();
if(isFinishing()) listActivityDone = true;
}
现在我的问题是,当用户按下ListActivity BACK按钮,我的NDK线程被正确的,但不幸的是唤醒,的onDestroy()是在之后调用我的NDK线程已被唤醒,因此我的NDK线程无法获得标志“listActivityDone”的正确值。当我的NDK线程被唤醒时,“listActivityDone”仍然是FALSE,因为在我的NDK线程被唤醒后立即调用onDestroy()。
所以我需要做的是解决这个问题是在将标记“listActivityDone”设置为TRUE后再次唤醒NDK线程。有人知道这可以实现吗?
当然,我可以从Java调用C函数,然后调用ALooper_wake(),但我几乎可以确定有更好的版本可以从Java端唤醒NDK线程。有任何想法吗?
感谢您的帮助!
我想过,但我不想在PAUSE上设置标志。它应该只在用户按下BACK按钮时设置(或者选择ListActivity的列表视图的项目)。 – Andreas
对不起,我没有注意到在onPause()中使用isFinishing()。不知道这可以在onPause()中使用。我会尝试一下。 – Andreas
好的,它适用于onPause(),但不适用于onStop()。所以它可以作为解决问题的方法。不过,我想知道是否有更好的解决方案从Java端唤醒C端... – Andreas