从Java发信号通知NDK线程

时间:2013-01-21 15:13:47

标签: java android android-ndk

我的应用程序在C语言中编写了99%,只有一些Java助手函数用于NDK中没有的东西。作为文件选择器,我正在使用ListActivity,我从Java端开始这样做:

Intent myIntent = new Intent(this, FileChooser.class);
startActivity(myIntent);

当此ListActivity正在运行时,我的NDK线程等待用户选择文件并使用

关闭ListActivity
ALooper_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线程。有什么想法吗?

感谢您的帮助!

2 个答案:

答案 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命令才能正常关闭?