在Android5.0系统上加载位于SD卡上的本地动态库
来源:互联网 发布:电脑钢琴软件 多键 编辑:程序博客网 时间:2024/05/20 21:47
在Android5.0系统上加载位于SD卡上的本地动态库
最近在加载位于Android设备SDCARD上的本地动态库时遇到权限问题,估计是5.0系统权限管理限制更多,而SDCARD上文件基本上没有可执行权限,而一般非root用户无法通过chmod为其添加.
加载代码(APP启动时):
System.load("/mnt/sdcard/libfeatureA.so");
异常闪退:
dlopen("/mnt/sdcard/libfeatureA.so", RTLD_LAZY) failed: dlopen failed: couldn't map "/mnt/sdcard/libfeatureA.so" segment 2: Operation not permitted
加载位于SD卡的so权限不够,那么将so复制到APP内部数据空间再加载呢,经测试是可行的.
加载代码(APP启动时):
NativeLibraryLoader.loadLibrary(this, "/mnt/sdcard", "libfeatureA.so");NativeLibraryLoader.loadLibrary(this, "/mnt/sdcard", "libfeatureB.so");
库加载类NativeLibraryLoader实现
/** * Created by linnvv_0011@163.com on 2015/10/10. */public class NativeLibraryLoader { public static boolean loadLibrary(Context context, String libPath, String libName) { File libs_dir = context.getDir("libs", Context.MODE_PRIVATE); String new_file_name = libs_dir.getPath() + "/" + libName; String old_file_name = libPath + "/" + libName; if (!copyLibrary(new_file_name, old_file_name)) { return false; } try { System.load(new_file_name); } catch (Exception ex) { ex.printStackTrace(); return false; } return true; } private static boolean copyLibrary(String new_file_name, String old_file_name) { FileInputStream fis = null; FileOutputStream fos = null; try { File new_file = new File(new_file_name); File old_file = new File(old_file_name); /* delete old library if exists. */ if (new_file.exists()) new_file.delete(); fis = new FileInputStream(old_file); fos = new FileOutputStream(new_file); int dataSize; byte[] dataBuffer = new byte[2048]; while ((dataSize = fis.read(dataBuffer)) != -1) { fos.write(dataBuffer, 0, dataSize); } fos.flush(); return true; } catch (Exception e) { e.printStackTrace(); } finally { try { if (fos != null) fos.close(); } catch (Exception e) { e.printStackTrace(); } try { if (fis != null) fis.close(); } catch (Exception e) { e.printStackTrace(); } } return false; }}
0 0
- 在Android5.0系统上加载位于SD卡上的本地动态库
- 解决HttpClient在Android5.0系统上无效的问题
- Android5.0上SD卡抽拔发送的Intent研究
- 在ImageView中加载SD卡上的图片资源
- FlashLight在Android5.0上的使用方法
- 在Android平台上加载本地库的危险性
- 在Android平台上加载本地库的危险性
- 树莓派(raspberry pi) 系统在SD卡上安装Linux
- APP在Android5.0上运行时闪退
- 让Activity在Android5.0上全屏
- OpenCV显示磁盘上的图像:cvLoadImage,cvShowImage加载并显示一幅图像(图像位于本地磁盘)
- 在地图上加载本地的三维控件
- 如何在Android5.1系统上实现RecyclerView高度自适应
- ImageView中显示SD卡上的图片或ImageView图片保存在SD卡上
- Android5.0新特性:RecyclerView实现上拉加载更多
- 在安卓4.2.2的系统上,具有系统权限的应用不能读写SD卡
- RecyclerView的点击事件,下拉刷新,上拉加载(Android5.0)
- android5.0效果的下拉刷新、上拉加载,可滚动置顶
- JSTL标签入门
- 如何将用Xcode编写的Cocos2d-x项目代码在Android Studio中运行
- Myeclipse学习总结(1)——Myeclipse优化配置
- Java加密解密技术系列之HMAC
- Django学习——开发你的第一个Django应用2
- 在Android5.0系统上加载位于SD卡上的本地动态库
- hdu4770 暴力状压 Lights Against Dudely (2013 Asia Hangzhou Regional Contest problem A)
- Java加密解密技术系列之DES
- 第二章 Winsock编程接口(1)
- iOS界面编程-UIButton
- Codeforces Round #321 (Div. 2)B. Kefa and Company
- 黑马程序员———java 集合框架
- 第二阶段
- You must restart adb and Eclipse的问题解决