私は最初にここで質問をしました:
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
ネイティブ コードを確認しましたが、バグは見当たりません。コードは、初めて実行したときにも機能します。これは、戻るボタンを押したときにすべてのリソースが解放されるわけではないことに関係しています。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
そのため、ポートレート モードでは 2 回発生します。そのため、System.exit(0) を onDestroy に挿入すると、デバイスが直立/ポートレート モードのときにアプリケーションが起動しません。
最善の解決策は、ネイティブ コードがクラッシュする本当の原因を見つけることだと思いますが、これまでのところ、原因を見つけられていません。記憶力の低さが関係しているのかもしれません。Debug.getNativeHeapFreeSize() を実行しようとしましたが、空きメモリの量が非常に少ない場合がありますが、エラー メッセージには「障害アドレス」と表示されます。
アプリケーションがクラッシュした後、そのアイコンを押して、問題なくアプリケーションを再実行します。したがって、アプリケーションは、アイコンを押した回数の半分しか正常に起動しません。
何が間違っているのか、または回避策があるのか わかりますか? このサイトで回答を検索したところ、二重ライフ サイクルの問題と JNI スタック トレースの取得方法に関する情報が見つかりました。もう少し様子を見て原因を探ってみます。デバイスが縦向きモードの場合に onDestroy が初めて呼び出されたときに System.exit(0) が呼び出されないようにする醜い回避策を作成することもできますが、アプリケーションがこの二重のライフサイクルの問題を持たないデバイスにインストールされている場合縦向きモードの場合、アプリケーションは適切にシャットダウンしません。
/キム