我正在编写一个Android NDK应用程序,该应用程序由C语言中的大型独立于平台的核心组成,其中包含几行基于android.app.NativeActivity
类的Java粘合代码。除了令我头疼的一件事之外,这个工作真的很好。
问题在于Android应用程序在调用ANativeActivity_finish()
时并没有真正退出,而是只是将它们置于某种空闲状态而AFAIU只有在Android需要资源时才真正被杀死。
这个Android的特性对我来说是个大问题,因为我的C核使用了很多全局变量,当我的C核运行其关闭代码时它们不会重置为0。因此,当Android在关闭后启动我的应用程序时,所有全局变量都包含从我上次运行应用程序而不是0时开始的随机状态。
在我的程序(Win32,Mac OS,Linux)支持的所有桌面系统上,这根本不是问题,因为在这些系统上程序确实可以退出。但在Android上,这是根本不同的。是的,我知道全局变量很糟糕,我应该在完成它们时将它们重置为0但是我们正在讨论一个已经开发了近20年的非常大的C核心,所以它需要大量的努力为Android清理这一切。
这就是为什么我想问一下是否有某种方法迫使Android始终将我的所有全局变为零,就像应用程序第一次启动时一样。
我已经完成了一些研究和AFAICS,这样做的唯一方法是使用android.os.Process.killProcess()
真正杀死我的应用程序,但这看起来像是一种强力方法。启动我的应用程序时,还有其他方法可以始终获得归零全局变量吗?
答案 0 :(得分:2)
初始归零由操作系统执行 - 变量存储占用新映射的页面。没有“零需要归零的东西”内部函数来调用。
您有两种基本方法:
方法#2的可行性取决于代码的性质。
是的,我知道全局变量很糟糕,我应该在完成它们时将它们重置为0但是
如果绝对必须使用全局变量,请创建一个全局结构并将所有内容堆积到其中,因此如果需要重置它或将所有状态转储到调试器中,则很容易找到所有内容。它并不理想,但它比管理散乱的全球和(天堂冒犯)静态本地人要容易得多。