android dlopen()中的竞争条件?

android dlopen()中的竞争条件?,第1张

概述我的Android应用程序有一个简单的“加载器”NativeActivity,它有一个非常简单的android_main(),它只加载一个不同的共享对象并将控制传递给它:typedef void (*Tandroid_main)( android_app*); void android_main( android_app* state ) { voi

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

@H_404_2@

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)更强大的东西只是在循环中尝试它:@H_404_2@

@H_404_2@

int count = 0;voID* glib = dlopen(soname,RTLD_Now);while(glib == NulL) {    sched_yIEld();    ++count;    glib = dlopen(soname,RTLD_Now);}

我从这个循环获得的计数通常在我的设备上的范围为10-70.但这是一个丑陋丑陋的解决方案.@H_404_2@

这是怎么回事?为什么我只能在NativeActivity启动后稍微加载其他共享对象?有没有更好的方法来找到什么时候加载它是安全的?@H_404_2@

应该注意的是,我也从NativeActivity的onCreate()调用System.loadlibrary(“main”)@H_404_2@最佳答案不确定,但建议从静态初始化程序调用loadlibrary():@H_404_2@

@H_404_2@

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

有帮助吗? 总结

以上是内存溢出为你收集整理的android dlopen()中的竞争条件?全部内容,希望文章能够帮你解决android dlopen()中的竞争条件?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1149719.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存