您的位置:首页 > 移动开发 > Android开发

Android动态加载so库的实现

2016-10-17 00:04 435 查看
so库加载包含2种方式:静态链接和动态加载
静态链接在Android中的实现方式就是当打包项目时,将so文件放到libs目录中。反之,动态加载需要加载前准备好so文件,并指定完整的文件路径,调用System.load常用的动态加载一般是将so文件放到assets目录中,在需要时再将其移动到内存或者sd存储中,这就意味着你的so文件可能有被替换的风险,所以使用这种方式加载so文件,加载前安全检查是必不可少的。

private void moveAssetLib(Context context) {
File file = null;
//项目中只保留了arm和x86 so文件
if (isX86CPU()) {
AppLog.e("current cpu abi is x86");
file = FileUtils.moveAssetFile(context, "x86/liballfree-jni.so", context.getDir("x86", Context
.MODE_PRIVATE));
} else {
AppLog.e("current cpu abi is not x86");
file = FileUtils.moveAssetFile(context, "armeabi/liballfree-jni.so", context.getDir("armeabi", Context
.MODE_PRIVATE));
}
if (file != null) {
try {
AppLog.d("try to load the lib file:" + file.getAbsolutePath());
//此处并不能使用System.loadLibrary,因为它只是根据PathClassLoader中的DexPathList确定的路径查询此文件,
//无法按照你指定的文件路径加载
//DexPathList常见目录:
//1) /data/app/包名/lib/arm
//2) /data/app/包名/base.apk!/lib/armeabi
//3) /vendor/lib (vendor为厂商定制目录)
//4) /system/lib

//指定文件路径
System.load(file.getAbsolutePath());
} catch (NullPointerException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  动态加载so