Я изначально задавал вопрос здесь:
http://www.experts -exchange.com / Программирование / Языки / 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
Я проверил нативный код и не вижу ошибок. Код также работает при первом запуске. Это как-то связано с тем, что при нажатии кнопки «назад» освобождаются не все ресурсы.
Хотя я нашел простое решение проблемы, вставив System.exit (0) в onDestroy (), но это работает только тогда, когда приложение находится в ландшафтном режиме.
В ландшафтном режиме жизненный цикл выглядит следующим образом:
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
Так что в портретном режиме все происходит дважды - поэтому, если я вставлю System.exit (0) в onDestroy, приложение не запустится, когда устройство находится в вертикальном / в портретном режиме.
Полагаю, лучшим решением было бы найти реальную причину сбоя нативного кода, но пока я не нашел причину. Может быть, это как-то связано с нехваткой памяти. Я попытался запустить Debug.getNativeHeapFreeSize (), и объем свободной памяти иногда очень мал, но в сообщении об ошибке говорится «адрес ошибки».
После сбоя приложения я нажимаю на его значок и снова запускаю приложение без проблем. Таким образом, приложение успешно запускается только в половине случаев, когда вы нажимаете его значок.
У вас есть идеи, что не так или, возможно, обходной путь?
Я искал ответ на этом сайте и нашел некоторую информацию о проблеме двойного жизненного цикла и о том, как получить трассировку стека JNI. Я еще посмотрю и посмотрю, смогу ли я найти причину. Я также мог бы сделать некрасивый обходной путь, который гарантирует, что System.exit (0) не будет вызываться при первом вызове onDestroy, если устройство находится в портретном режиме, но если приложение затем установлено на устройстве, у которого нет этой двойной проблемы жизненного цикла приложение не будет корректно завершать работу в портретном режиме.
/ Kim