我最初在这里问过这个问题:
http
://www.experts-exchange.com/Programming/Languages/Java/Android/Q_26754261.html
但我想这可能是一个更好的提问地方。
我制作了一个调用一些本机代码的 Android 应用程序。当我第一次在 Android 2.2 设备上运行应用程序时(通过按下图标),它工作正常,但如果我按下后退按钮,然后通过再次按下其图标重新启动应用程序,应用程序崩溃(来自 eclipse 的信息):
01-19 13:21:51.989: INFO/DEBUG(30): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
01-19 13:21:51.989: INFO/DEBUG(30): Build fingerprint: 'generic/sdk/generic:2.3/GRH55/79397:eng/test-keys'
01-19 13:21:51.989: INFO/DEBUG(30): pid: 354, tid: 381 >>> Test.Application <<<
01-19 13:21:51.989: INFO/DEBUG(30): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0000005a
我检查了本机代码,没有看到任何错误。该代码在我第一次运行时也有效。这与按下后退按钮时并非所有资源都被释放有关。我虽然通过在 onDestroy() 中插入 System.exit(0) 找到了一个简单的解决方案,但这仅在应用程序处于横向模式时才有效。
在横向模式下,生命周期是这样的:
01-15 22:38:29.913: INFO(18062): onCreate
01-15 22:38:30.143: INFO(18062): onResume
Pressed back button
01-15 22:38:34.093: INFO(18062): onPause
01-15 22:38:34.343: INFO(18062): OnDestroy
在纵向模式下,生命周期是这样的:
01-15 22:41:00.343: INFO(18167): onCreate
01-15 22:41:00.863: INFO(18167): onResume
01-15 22:41:00.913: INFO(18167): onPause
01-15 22:41:00.913: INFO(18167): OnDestroy
01-15 22:41:01.423: INFO(18167): onCreate
01-15 22:41:01.693: INFO(18167): onResume
Pressed back button
01-15 22:41:05.663: INFO(18167): onPause
01-15 22:41:05.963: INFO(18167): OnDestroy
所以在纵向模式下事情会发生两次 - 所以如果我在 onDestroy 中插入 System.exit(0) ,当设备处于直立/纵向模式时,应用程序将不会启动。
我想最好的解决方案是找到本机代码崩溃的真正原因,但到目前为止我还没有找到原因。也许它与内存不足有关。我尝试运行 Debug.getNativeHeapFreeSize() 并且可用内存量有时非常低,但错误消息显示“故障地址”。
应用程序崩溃后,我按下它的图标并再次运行应用程序而没有问题。因此,该应用程序仅在您按下其图标的一半时成功启动。
您是否知道出了什么问题或可能的解决方法?我在这个网站上搜索了答案,发现了一些关于双生命周期问题以及如何获取 JNI 堆栈跟踪的信息。我会多看一些,看看能不能找到原因。我还可以制定一个丑陋的解决方法,确保在设备处于纵向模式时第一次调用 onDestroy 时不调用 System.exit(0),但如果应用程序安装在没有这种双生命周期问题的设备上在纵向模式下,应用程序将无法正常关闭。
/金