jniコードを使用するAndroidアプリケーションを作成しようとしています。
この jni コードは、解放する必要があるメモリを割り当てます。この
コードを含むこのクラスがあるとします。
class MyJniClass{
public native void jni_init(); //this allocates some memory
public native void do_something(); //this also allocates some memory,
which is linked to the memory allocated in jni_init()
public native void jni_destroy(); //this frees all the allocated
memory in two previous functions
... // some other java code
}
jni_init
私の問題は、アクティビティライフサイクルのどこでとを呼び出すかjni_destroy
です。そこで、アクティビティのライフサイクルが正確にどのように機能するかを掘り下げ始めましたが、結果について少し混乱しています。
これは、Linux プロセスのレベルまでかなり深く理解しようとしていることが原因だと思います。しかし、私はjniを使用しているので、ある程度理にかなっています。
簡単なアクティビティを作成し、すべてのライフサイクル コールバックを実装して、いくつかのログを記録しました。コンストラクターでも同じことを行い、プロセスのログを記録する jni コードも追加しましたpid
。
だから、私が見つけたもの - onDestroy が呼び出されていなくても、アクティビティは破棄される可能性があり (これは明らかです。これについては多くの説明が見つかりました)、プロセスはまだ実行されています (Usage Timelines、ps コマンド、getpid jni などのアプリによって検証されています)。電話)。プロセスは実行中であるため、メモリの割り当てを維持することは理にかなっているようです。
問題は、メモリをどこに割り当てるかです。onCreate
プロセスの存続期間中に数回呼び出すことができるため、メモリリークが発生する可能性があるため、使用できません。また、割り当てに onStart を使用し、解放に onStop を使用したくありません。これは不要な作業だからです。シングルトンデザインを試してみましたが、うまくいくようですが、 MyJniClass を再入可能にする必要があるため、使用したくありません (サービスでも使用したい)。だから私の質問は - jni アプリでメモリ管理を行うための推奨される方法はありますか?
編集:これの最も紛らわしい部分を十分に明確に説明していないようです。イベントのシーケンスは次のとおりです。
1) ランチャーのアイコンを使用してアプリを起動します
2) 新しいアクティビティが作成される (構築される)
3) onCreate が呼び出される
4) onStart が呼び出されます
5) onResume が呼び出されます
6) ホームボタンを押す
7) onSaveInstanceState が呼び出されます
8) onPause が呼び出されます
9) onStop が呼び出されます
10) ランチャーのアイコンを使用してアプリを起動します (手順 1 と同様)。
11) 新しいアクティビティが作成される (構築される)
12) onCreate が呼び出される
13) onStart が呼び出されます
14) onResume が呼び出されます
紛らわしい手順は 11) と 12) です。これは、プロセス (pid) が同じであるためです。
すべての文法ミスに感謝し、申し訳ありません。