Android动态加载so库的实现
2016-10-17 00:04
435 查看
so库加载包含2种方式:静态链接和动态加载
静态链接在Android中的实现方式就是当打包项目时,将so文件放到libs目录中。反之,动态加载需要加载前准备好so文件,并指定完整的文件路径,调用System.load常用的动态加载一般是将so文件放到assets目录中,在需要时再将其移动到内存或者sd存储中,这就意味着你的so文件可能有被替换的风险,所以使用这种方式加载so文件,加载前安全检查是必不可少的。
静态链接在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(); } } }
相关文章推荐
- Android腾讯微博客户端开发5:利用FootView实现ListView滑动动态加载实现分页
- android 动态加载 语言xml 实现国际化
- Android动态加载jar、apk的实现
- Android动态加载jar、apk的实现
- Android_Loader_使用LoaderManager管理Loader实现异步动态加载数据
- Android腾讯微博客户端开发5:利用FootView实现ListView滑动动态加载实现分页
- Android 实现布局动态加载
- Android动态加载jar、apk的实现
- android动态加载so库
- android 实现listview动态加载列表项
- android 实现listview动态加载列表项
- Android 中动态加载.jar的实现步骤
- Android 实现布局动态加载
- Android中ViewFlipper实现动态加载view
- Android动态加载jar、apk的实现
- Android腾讯微博客户端开发五:利用FootView实现ListView滑动动态加载实现分页
- Android中ViewFlipper实现动态加载view
- 用ActivityGroup实现动态加载-Android网易顶部导航栏(转)
- android 实现listview动态加载列表项
- [置顶] Android_Loader_使用LoaderManager管理Loader实现异步动态加载数据