我的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()中的竞争条件?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)