2013-01-21 36 views
0

我的应用程序在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线程。有任何想法吗?

感谢您的帮助!

回答

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中

+0

我想过,但我不想在PAUSE上设置标志。它应该只在用户按下BACK按钮时设置(或者选择ListActivity的列表视图的项目)。 – Andreas

+0

对不起,我没有注意到在onPause()中使用isFinishing()。不知道这可以在onPause()中使用。我会尝试一下。 – Andreas

+0

好的,它适用于onPause(),但不适用于onStop()。所以它可以作为解决问题的方法。不过,我想知道是否有更好的解决方案从Java端唤醒C端... – Andreas

0

您能否只处理APP_CMD_TERM_WINDOW命令以正确关闭?

+0

我不明白这一点。不是APP_CMD_TERM_WINDOW在C端处理的命令吗?我应该如何能够从Java方面使用它?我想唤醒Java的C端事件循环... – Andreas

+0

为什么你需要从Java中唤醒C端?当你的活动被破坏时,你似乎想要唤醒它。当窗口被销毁时,该命令应该发生。这足以满足您的需求吗? –

+0

不,APP_CMD_TERM_WINDOW正在发生,当我的C活动的窗口被破坏,但这不是我的问题是关于。当用Java编写的子活动被破坏时(ListActivity),我想唤醒C端。在ListActivity销毁之后,C端应该在ListActivity中获取用户的选择,然后继续运行。这就是为什么我的C端(NativeActivity)需要等待Java子活动(ListActivity)完成,因为C端在Java子活动退出之前无法继续运行,因为C端依赖于Java端的结果。 – Andreas