2015-09-06 15 views
5

My Android aplikacja posiada prosty „Loader” NativeActivity z bardzo prostego android_main() których tylko ładuje inny obiekt udostępniony i przekazuje kontrolę do niego:Stan wyścigu w android 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) 
} 

Działa to dobrze .. około połowy czasu. Innym razem zawiesza się, ponieważ dlopen() kończy się niepowodzeniem i zwraca NULL z errno = 2 (brak takiego pliku).
Ze względu na dziwną niespójność tego zdarzenia podejrzewałem problem z synchronizacją i rzeczywiście, przed dodaniem sleep(1) przestałem to robić. Coś bardziej wytrzymałe niż sleep(1) byłoby po prostu próbuje go w pętli:

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

Ilość Dostaję od tej pętli jest zazwyczaj coś w przedziale 10-70 na moim urządzeniu. Ale to jest brzydkie, brzydkie rozwiązanie.

Co tak naprawdę się tutaj dzieje? Dlaczego mogę wczytać inne udostępnione obiekty tylko trochę po uruchomieniu NativeActivity? Czy istnieje lepszy sposób na sprawdzenie, kiedy można go bezpiecznie załadować?

Należy zauważyć, że ja również nazywając System.loadLibrary("main") z mojego NativeActivity na onCreate()

Odpowiedz

4

Nie jestem pewien, ale zaleca się, aby zadzwonić LoadLibrary() od statycznego inicjatora:

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

Czy to pomoże?

+0

Yap, to rozwiązało! dobry chwyt :) – shoosh

Powiązane problemy