重新启动时Android应用程序崩溃

时间:2011-01-20 07:45:08

标签: c++ android debugging java-native-interface portrait

我原先在这里问过这个问题:
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)但是如果应用程序安装在没有此双生命周期问题的设备上在纵向模式下,应用程序不会正常关闭。

/金

1 个答案:

答案 0 :(得分:0)

实际上是因为我忘了在C ++代码中释放一些内存,而这个错误发生了。现在它终于不再崩溃了,双重生命周期问题再也不重要了。