2015-09-06 79 views
5

我的Android應用程序有一個非常簡單的android_main()只加載不同的共享對象,向它傳遞控制一個簡單的「裝載機」 NativeActivity的: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) 
} 

這工作好..關於時間的一半。其他時候它崩潰,因爲dlopen()失敗,並返回NULL errno = 2(沒有這樣的文件)。
由於這種情況的奇怪的不一致,我懷疑是一個時間問題,事實上,在dlopen()停止發生之前增加一個sleep(1)。東西比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啓動後,我怎麼只能稍微加載其他共享對象?有沒有更好的方法來找到何時可以安全地加載它?

應當指出的是,我也呼籲從System.loadLibrary("main")我NativeActivity的的onCreate()

回答

4

不知道,但建議從靜態初始化調用LoadLibrary():

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

幫助?

+0

邑,解決了它!很好的抓住:) – shoosh