NDKの共有ライブラリでグローバル変数、スタティック変数は自分で明示的に初期化しなくてはならない

strange behaviour in shared library loading
http://groups.google.co.jp/group/android-ndk/browse_thread/thread/e536487f146da5e9#

このスレッドで書かれていることを読み解くと、
ネイティブの共有ライブラリにグローバル変数やスタティック変数のデータは一番最初に起動した時には正しく初期化されて問題ないけれども、2回め以降はそれらが初期化されるかどうかは不定だということ。なのでグローバル変数やスタティック変数の初期値はローダまかせでなく、自分で明示的に初期化しなくてはならない。

つまり、

char work[100] = {0};
int flag; /* == 0 であることを想定 */

のようにローダまかせにしてはダメで

void init_data()
{
    memset(work, 0, sizeof(work));
    flag = 0;
}

のような関数を作ってこれを onCreateのタイミングで呼び出してやる必要があるということです。
(Read onlyのデータはローダまかせで大丈夫です。)

アプリケーションのライフサイクルとプロセスのライフサイクルが無関係だからというのがその理由です。
確かにアプリケーションが2回めに起動される時には、新しいプロセスが起動される場合とさっきのプロセスがまだ残っていてそれが再利用される場合の両方の可能性があり、それはアプリケーション側からは制御できません。後者の場合は共有ライブラリはメモリ上に残っていたものがそのまま再利用されるわけです。


これって既存のライブラリを流用する場合の落とし穴になりそう。