2015-09-06 12 views
5

mia app Android ha un semplice NativeActivity "loader" con un molto semplice android_main() che carica solo un oggetto condiviso diverso e passa il controllo ad esso:Condizioni di gara in 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) 
} 

Questo metodo funziona bene .. circa la metà delle volte. Altre volte si blocca poiché dlopen() non riesce e restituisce NULL con errno = 2 (Nessun file di questo tipo).
A causa della strana incoerenza di questo evento, ho sospettato un problema di temporizzazione e, in effetti, l'aggiunta di sleep(1) prima che lo dlopen() interrompesse l'operazione. Qualcosa di più robusto di sleep(1) sarebbe solo cercando in un ciclo:

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

Il conteggio che sto ricevendo da questo ciclo è di solito qualcosa nella gamma di 10-70 sul mio dispositivo. Ma questa è una brutta soluzione hackish.

Cosa sta succedendo davvero qui? Come mai posso caricare solo altri oggetti condivisi solo dopo l'avvio di NativeActivity? C'è un modo migliore per trovarlo quando è sicuro caricarlo?

Va notato che sto anche chiamando System.loadLibrary("main") dal mio di NativeActivity onCreate()

risposta

4

Non sono sicuro, ma si consiglia di chiamare LoadLibrary() da un inizializzatore statico:

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

Aiuta?

+0

Yap, questo l'ha risolto! bella presa :) – shoosh

Problemi correlati