I82*_*uch 7 java java-native-interface android native android-ndk
所有,
我知道默认情况下,当屏幕方向改变或键盘滑入或滑出时,活动将被终止并重新启动.(请参阅Android上的活动重启).我的问题是,从Native代码的角度处理这个问题的正确方法是什么?例如,如果我有一个静态块加载本机库并且我的应用程序重新启动,我如何确保本地的任何内存都得到适当处理?问题是
当我们旋转设备时,它看起来像是创建了一个单独的线程池,并且永远不会删除旧的线程池.这意味着每当有人转动设备时,我们就会有更多线程闲置并占用内存
我如何确保不会发生这种情况?我从JNIExample页面看到底部的一些注释:
[*]未解决的问题和错误尽管该示例功能齐全,但仍有一些未解决的问题,到目前为止我无法弄清楚.启动活动时出现问题,然后按"返回"按钮将其隐藏,然后再次启动.根据我的经验,在这种重新启动的活动中调用本机函数将会失败.callVoid()只是因为分段错误而崩溃,而对getNewData()和getDataString()的调用会导致JVM因错误而中止,因为它对全局缓存的对象引用不再满意.看起来活动重启会以某种方式使我们的缓存对象引用无效,即使它们受NewGlobalRef()保护,并且活动在原始JVM中运行(活动重启并不意味着JVM本身已重新启动).我没有很好的解释为什么会发生这种情况,所以如果您有任何想法,请告诉我.
这已经解决了吗?
重新启动Android NDK很烦人.您有任何静态数据,因为它重用了该过程,因此您需要手动重置在新运行中无效的任何内容(如任何OpenGL纹理或顶点缓冲区对象).它还为您提供了新的Java线程和新的Java应用程序以及其他对象,因此任何对应用程序的新实例中都是新的对象的缓存全局引用也需要清除.
所以我使用的策略是双重的:最小化重启,并在重启时核对一切.
您可以通过处理appChanges in-app来最小化重启,正如您在链接问题的答案中所说的那样.然后打开键盘或旋转不会导致应用程序重新启动,这应该是任何具有非平凡启动时间的应用程序.
当我检测到我的应用程序的新实例已经启动时,我会在那时从旧实例中释放所有关键内容,包括通过NewGlobalRef释放我保留的任何Java对象.我试图最小化静态数据,但是在我检测到新实例启动的时候,我在静态对象周围保留了几个不可避免的地方.
一旦没有更多未完成的引用(即,一旦释放了所有NewGlobalRef对象),旧线程就会消失.
| 归档时间: |
|
| 查看次数: |
3611 次 |
| 最近记录: |