代码之家  ›  专栏  ›  技术社区  ›  Andreas

在所有全局变量为零的情况下启动应用程序

  •  1
  • Andreas  · 技术社区  · 10 年前

    我正在编写一个Android NDK应用程序,它由一个大型的C平台独立内核和几行基于 android.app.NativeActivity 班这真的很好,除了一件事让我头疼。

    问题是Android应用程序在调用时不会真正退出 ANativeActivity_finish() 但相反,它们只是被置于某种空闲状态,AFAIU只有在Android需要资源时才真正被杀死。

    这个Android的特性对我来说是一个巨大的问题,因为我的C内核使用了很多全局变量,当我的C核心运行其关闭代码时,它们不会重置为0。因此,当Android在我的应用程序关闭后启动它时,所有全局变量都包含我的应用上次运行时的一些随机状态,而不是0。

    这在我的程序支持的所有桌面系统(Win32、Mac OS、Linux)上都不是问题,因为在这些系统上,程序真的可以退出。但在Android上,这是根本不同的。是的,我知道全局变量是坏的,我应该在处理完它们后将它们重置为0,但我们谈论的是一个非常大的C内核,它已经开发了近20年,所以仅为Android就需要付出巨大的努力来清理这一切。

    这就是为什么我想问一下,是否有什么方法可以强制Android像第一次启动应用程序时一样,始终将我的所有全局设置为零。

    我已经做了一些研究和AFAICS,唯一的方法就是使用 android.os.Process.killProcess() 但这看起来像是一种暴力方法。在启动我的应用程序时,没有任何其他方法可以始终获得零全局值吗?

    1 回复  |  直到 10 年前
        1
  •  2
  •   fadden    10 年前

    初始归零由操作系统执行——变量存储占用新映射的页面。没有“将需要清零的内容清零”的内部函数可以调用。

    您有两种基本方法:

    1. 让Android应用程序像在其他平台上一样工作,并手动关闭应用程序以强制重新加载。
    2. 让你的应用程序像Android一样工作,不要在暂停时表现得像完全关闭一样。换句话说,永远不要运行关机代码。当应用程序暂停时,你仍然需要释放大量资源,但这应该比拆掉所有东西少一些负担。

    方法#2的可行性取决于代码的性质。

    是的,我知道全局变量是坏的,我应该在处理完它们后将它们重置为0,但是

    如果您绝对必须使用全局结构,请创建一个全局结构并将所有内容堆积在其中,因此如果您需要重置它或在调试器中转储所有状态,那么很容易找到所有内容。这并不理想,但比起猎捕分散的全球动物和(天堂保护)静止的本地动物,管理起来要容易得多。

    推荐文章