sho*_*osh 5 android dlopen race-condition android-ndk native-activity
我的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)
}
Run Code Online (Sandbox Code Playgroud)
这很好..大约一半的时间.其他时候它崩溃,因为dlopen()失败并返回NULL与errno = 2(没有这样的文件).
由于这种情况的奇怪不一致,我怀疑时间问题,事实上,添加一个sleep(1)之前dlopen()阻止它发生.比sleep(1)在循环中尝试它更强大的东西:
int count = 0;
void* glib = dlopen(soName, RTLD_NOW);
while(glib == NULL) {
sched_yield();
++count;
glib = dlopen(soName, RTLD_NOW);
}
Run Code Online (Sandbox Code Playgroud)
我从这个循环获得的计数通常在我的设备上的范围为10-70.但这是一个丑陋丑陋的解决方案.
这是怎么回事?为什么我只能在NativeActivity启动后稍微加载其他共享对象?有没有更好的方法来找到什么时候加载它是安全的?
应该注意的是,我也在使用System.loadLibrary("main")NativeActivity进行调用onCreate()
不确定,但建议从静态初始值设定项调用 loadLibrary():
public class MainActivity extends Activity {
static {
System.loadLibrary("main")
}
...
}
Run Code Online (Sandbox Code Playgroud)
有帮助吗?
| 归档时间: |
|
| 查看次数: |
334 次 |
| 最近记录: |