启动应用程序,将所有全局变量置零

时间:2016-01-19 17:46:40

标签: android-ndk

我正在编写一个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()真正杀死我的应用程序,但这看起来像是一种强力方法。启动我的应用程序时,还有其他方法可以始终获得归零全局变量吗?

1 个答案:

答案 0 :(得分:2)

初始归零由操作系统执行 - 变量存储占用新映射的页面。没有“零需要归零的东西”内部函数来调用。

您有两种基本方法:

  1. 让Android应用程序像在其他平台上一样工作,并手动终止应用程序以强制重新加载。
  2. 让您的应用程序像Android一样运行,并且不会在它暂停时完全关闭。换句话说,不要运行关机代码。当应用程序暂停时,您仍然需要释放大量资源,但这比减少所有内容的负担要小。
  3. 方法#2的可行性取决于代码的性质。

      

    是的,我知道全局变量很糟糕,我应该在完成它们时将它们重置为0但是

    如果绝对必须使用全局变量,请创建一个全局结构并将所有内容堆积到其中,因此如果需要重置它或将所有状态转储到调试器中,则很容易找到所有内容。它并不理想,但它比管理散乱的全球和(天堂冒犯)静态本地人要容易得多。