Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/210.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
android dlopen()中的竞争条件?_Android_Android Ndk_Race Condition_Dlopen_Native Activity - Fatal编程技术网

android dlopen()中的竞争条件?

android dlopen()中的竞争条件?,android,android-ndk,race-condition,dlopen,native-activity,Android,Android Ndk,Race Condition,Dlopen,Native Activity,我的Android应用程序有一个简单的“loader”本机活动,带有一个非常简单的Android\u main(),它只加载不同的共享对象并将控制权传递给它: typedef void (*Tandroid_main)( android_app*); void android_main( android_app* state ) { void* glib = dlopen("libmain.so", RTLD_NOW); void* fmain = dlsym(glib, "an

我的Android应用程序有一个简单的“loader”本机活动,带有一个非常简单的
Android\u 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)
阻止了它的发生。比睡眠(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")
    }
    ...
}
有帮助吗