2015-09-06 87 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