6

我的 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 (没有这样的文件)。
由于此事件的奇怪不一致,我怀疑是时间问题,实际上,添加一个sleep(1)beforedlopen()阻止了它的发生。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

1 回答 1

5

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

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

它有帮助吗?

于 2015-09-08T14:41:07.700 回答