android dlopen()中的竞争条件?

我的Android应用程序有一个简单的“加载器”NativeActivity,它有一个非常简单的android_main(),它只加载一个不同的共享对象并将控制传递给它:

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启动后稍微加载其他共享对象?有没有更好的方法来找到什么时候加载它是安全的?

应该注意的是,我也从NativeActivity的onCreate()调用System.loadLibrary(“main”)

最佳答案
不确定,但建议从静态初始化程序调用loadLibrary():

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

有帮助吗?

相关文章

Android性能优化——之控件的优化 前面讲了图像的优化,接下...
前言 上一篇已经讲了如何实现textView中粗字体效果,里面主要...
最近项目重构,涉及到了数据库和文件下载,发现GreenDao这个...
WebView加载页面的两种方式 一、加载网络页面 加载网络页面,...
给APP全局设置字体主要分为两个方面来介绍 一、给原生界面设...
前言 最近UI大牛出了一版新的效果图,按照IOS的效果做的,页...