(4.1.27.11)Android动态加载so文件
来源:互联网 发布:保定学习seo 编辑:程序博客网 时间:2024/06/09 17:13
在开发过程中,经常会用到第三方库,比如地图、视频、文档编辑、图表之类。依赖这些库,需要添加其SDK,有时需要用到jni层的So文件,比如百度地图等。
那么问题来了,如果两个不同的库之间的so文件发生冲突这么办?
比如:单独添加地图的库,运行没有问题。单独添加一个视频库,运行没有问题。但两者同时添加,其中一个库在init的时候报错。这当然和第三方库的开发水平有很大关系,但我们怎么解决这个问题呢?这就用到动态加载的方法。
这是原先的静态加载方法,将所有依赖库的so文件全部一股脑的放进armeabi文件夹即可。
动态加载的方法,我将冲突的so文件放在assets文件夹中
这里需要注意的是:动态加载so的文件只能放在两个地方:1. lib文件夹中,即对应Android Studio中的jniLibs文件夹。2. 本地data/data/package数据目录下。 所以,当应用第一次启动的时候,必须将我们放在assets文件夹中的so文件拷贝乳本地数据目录下。
//每次进入app,遍历assets目录下所有的文件,是否在data/data目录下都已经存在,不存在则拷贝 private void initAssetsFile() { boolean needCopy = false; // 创建data/data目录 File file = getApplicationContext().getFilesDir(); String path = file.toString() + "/armeabi/"; // 遍历assets目录下所有的文件,是否在data/data目录下都已经存在 try { String[] fileNames = getApplicationContext().getAssets().list("armeabi"); for (int i = 0; fileNames != null && i < fileNames.length; i++) { if (!TFileUtils.isFileExit(path + fileNames[i])) { needCopy = true; break; } } } catch (IOException e) { e.printStackTrace(); } if (needCopy) { CommonUtils.copyFilesFassets(getApplicationContext(), "armeabi", path); } } //将旧目录中的文件全部复制到新目录 public static void copyFilesFassets(Context context, String oldPath, String newPath) { try { // 获取assets目录下的所有文件及目录名 String fileNames[] = context.getAssets().list(oldPath); // 如果是目录名,则将重复调用方法递归地将所有文件 if (fileNames.length > 0) { File file = new File(newPath); file.mkdirs(); for (String fileName : fileNames) { copyFilesFassets(context, oldPath + "/" + fileName, newPath + "/" + fileName); } } // 如果是文件,则循环从输入流读取字节写入 else { InputStream is = context.getAssets().open(oldPath); FileOutputStream fos = new FileOutputStream(new File(newPath)); byte[] buffer = new byte[1024]; int byteCount = 0; while ((byteCount = is.read(buffer)) != -1) { fos.write(buffer, 0, byteCount); } fos.flush(); is.close(); fos.close(); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } //在需要初始化SDK的地方,指定so文件的路径 private void initAPI() { File file = getApplicationContext().getFilesDir(); String path = file.toString() + "/armeabi/"; EzvizAPI.init(getApplication(), key, path); }
当然,上面这个方法是将so文件放在程序的assets文件夹。另一种方法是:也可以从网络上下载,放入本地数据目录下。这样的好处是不仅减小的了apk的大小,而且可以随时使用最新的依赖库,这也是动态加载的最多得用途之一。
文/Hi_陈利健(简书作者)
原文链接:http://www.jianshu.com/p/9609e1fb8756
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
原文链接:http://www.jianshu.com/p/9609e1fb8756
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
0 0
- (4.1.27.11)Android动态加载so文件
- Android动态加载so文件
- Android动态加载so文件
- Android动态加载SO文件
- CrossWalk - Android 动态加载so库文件
- Android动态加载—so文件
- 动态加载so文件
- Android动态加载so
- Android 动态加载so
- android 动态加载.so
- android .so文件加载
- 动态加载so库文件
- 动态加载so库文件
- JNI动态加载so文件
- Android JNI学习笔记——so文件动态加载
- android动态加载so库
- Android C++ 动态加载so
- android动态链接库(so文件)
- Android Studio解决plugin with id 'android' not found问题
- java se-作业5-复制文件-2016.7.24
- 【MySQL】JDBC连接MySQL的一些问题以及解决办法
- spring mvc无法访问controller的解决方法
- JSP技术(四)——JSP标签
- (4.1.27.11)Android动态加载so文件
- hdu 3699 fzu 2009 A hard Aoshu Problem 枚举 模拟
- EasyDarwin开源流媒体云平台之语音对讲功能设计与实现
- 变量的定义 scanf 的使用 简单运算符
- java开发环境配置及软件下载
- php的写时复制
- c printf格式总结
- POJ 2533 Longest Ordered Subsequence
- scrapy爬虫实战(二)-------------爬取IT招聘信息