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

Android NDK:重启活动后如何清理本机代码?

  •  7
  • I82Much  · 技术社区  · 14 年前

    所有人,

    Activity restart on rotation Android ). 我的问题是,从本机代码的角度来处理这个问题的正确方法是什么?e、 g.如果我有一个静态块加载本机库,并且我的应用程序重新启动,我如何确保本机内存得到适当处理?问题是

    当我们旋转设备时,它看起来 旧的永远不会被移除。 这意味着每次有人 打开设备,我们还有很多 记忆

    JNIExample page 下面是一些注释:

    [*]未解决的问题和错误甚至 功能性的,有几个 还有待解决的问题,我 启动时出现问题 把它藏起来,然后重新开始。 以我的经验,打电话给本地人 此类重新启动活动中的函数 会以惊人的方式失败。callVoid() 调用getNewData()和 getDataString()导致JVM中止 有一个错误,因为它不再是 对全局缓存对象感到满意 参考资料。看来这项活动 重新启动会以某种方式使缓存无效 使用NewGlobalRef()保护,并且 活动正在 原始JVM(活动重启会 并不意味着JVM本身就是 重新启动)。我没有一个好的 解释为什么会这样,所以如果 知道。

    这件事解决了吗?

    2 回复  |  直到 8 年前
        1
  •  7
  •   SomeCallMeTim    14 年前

    在Android NDK中重启很烦人。您拥有的任何静态数据都会被粘住,因为它会重用进程,所以您需要手动重置在新运行中无效的任何数据(如任何OpenGL纹理或顶点缓冲区对象)。它还为您提供了一个新的Java线程、新的Java应用程序和其他对象,因此在应用程序的新实例中可能是新的对象的任何缓存全局引用也需要清除。

    所以我使用的策略有两个:最小化重启,重启时对所有东西进行核弹攻击。

    您可以通过处理app中的configChanges来最小化重启,正如它在对您链接的问题的回答中所说的那样。然后,打开键盘或旋转不会导致应用程序重新启动,这对于任何启动时间不重要的应用程序来说都应该如此。

    一旦不再有对旧线程的突出引用(即,一旦释放了所有NewGlobalRef对象),旧线程就应该消失。

        2
  •  2
  •   fadden    14 年前

    如果VM重新启动,则从头开始。如果不是的话,国家就在你离开的地方。从NewGlobalRef下提取内容的缓存对象引用不会失效。我还写了一些关于伍伊德那篇文章的笔记 on the NDK mailing list .