2015-09-06 29 views
5

私のAndroidアプリは、唯一異なる共有オブジェクトをロードし、それに制御を渡し、非常に単純なandroid_main()を持つ単純な「ローダー」NativeActivityがありますアンドロイドdlopen()の競合状態?

typedef void (*Tandroid_main)(android_app*); 
void android_main(android_app* state) 
{ 
    void* glib = dlopen("libmain.so", RTLD_NOW); 
    void* fmain = dlsym(glib, "android_main"); 
    Tandroid_main libmain = (Tandroid_main)fmain; 
    libmain(state) 
} 

これは倍の約半分...うまく動作します。 dlopen()が失敗し、errno = 2(そのようなファイルはありません)でNULLを返してからクラッシュします。
私はこの問題の奇妙な不一致のためにタイミングの問題が疑われており、実際にsleep(1)を追加してからdlopen()が起こることをやめました。 sleep(1)はちょうどループでそれをしようとされるよりも、より堅牢な何か:

int count = 0; 
void* glib = dlopen(soName, RTLD_NOW); 
while(glib == NULL) { 
    sched_yield(); 
    ++count; 
    glib = dlopen(soName, RTLD_NOW); 
} 

私はこのループから取得していたカウントは、通常、私のデバイス上の10-70の範囲内のものです。しかし、これは厄介な醜い解決策です。

ここで実際に何が起こっていますか? NativeActivityが開始された後、わずかに他の共有オブジェクトのみを読み込むことができますか?それをロードするのが安全な時を見つける良い方法はありますか?

私がまた私のNativeActivityのonCreate()

答えて

4

わからないからSystem.loadLibrary("main")を呼び出していますが、静的初期化子からのLoadLibrary()を呼び出すことが推奨されることに留意すべきである:それは助けない

public class MainActivity extends Activity { 
    static { 
     System.loadLibrary("main") 
    } 
    ... 
} 

+0

ヤップ、それを解決!ナイスキャッチ :) – shoosh