忘记密码   免费注册 查看新帖 |

ChinaUnix.net

  平台 论坛 博客 文库 频道自动化运维 虚拟化 储存备份 C/C++ PHP MySQL 嵌入式 Linux系统
最近访问板块 发新帖
查看: 4380 | 回复: 6

[Android] [Android] 请教android对so库的加载与调用 [复制链接]

论坛徽章:
0
发表于 2015-07-18 11:02 |显示全部楼层
本帖最后由 kingroc711 于 2015-07-18 16:09 编辑

一、小弟在使用第三方的.so库做android开发,发现仅仅放到AndroidProject/libs/armeabi/libminivenus.so这个位置,使用System.loadLibrary加载起来可以正常使用。
二、库的名字必须是libminivenus.so,不可以改名字。也不可以使用System.load从其他地方加载(非SD卡)。如果将库的名字或者加载位置改动,加载可以成功,但调用的jni接口就返回错误。
三、小弟发现libminivenus.so中确实有libminivenus的字段,将库的名字与该字段一起修改结果无效。
四、小弟请教这是第三方库做的什么限制呢。

论坛徽章:
39
白银圣斗士
日期:2015-11-24 10:40:40酉鸡
日期:2015-03-20 14:15:44寅虎
日期:2015-03-20 14:13:59午马
日期:2015-03-20 14:13:16白羊座
日期:2015-03-20 14:12:54金牛座
日期:2015-03-20 14:12:09双子座
日期:2015-03-20 14:11:57巨蟹座
日期:2015-03-20 14:11:44狮子座
日期:2015-03-20 14:11:29亥猪
日期:2015-03-20 14:16:24戌狗
日期:2015-03-20 14:16:40申猴
日期:2015-03-20 14:17:05
发表于 2015-07-18 14:00 |显示全部楼层
android4.x之后已经限制so不能从sdcard加载,但是可以从其他目录加载.
so库不是简单的改一个字符串就行的.
如果加载成功,调用出错,那说明确实做了位置判断,不过真的很少会有这样的需求,一般常见的是会做包名判断,自身完整性校验

论坛徽章:
0
发表于 2015-07-18 16:03 |显示全部楼层
回复 2# rover12421


    您好:
  
            我使用System.load是可以动态加载的(非SD卡),但是在调用函数的时候,却返回失败。请问so是如何做位置判断的呢?
           

论坛徽章:
39
白银圣斗士
日期:2015-11-24 10:40:40酉鸡
日期:2015-03-20 14:15:44寅虎
日期:2015-03-20 14:13:59午马
日期:2015-03-20 14:13:16白羊座
日期:2015-03-20 14:12:54金牛座
日期:2015-03-20 14:12:09双子座
日期:2015-03-20 14:11:57巨蟹座
日期:2015-03-20 14:11:44狮子座
日期:2015-03-20 14:11:29亥猪
日期:2015-03-20 14:16:24戌狗
日期:2015-03-20 14:16:40申猴
日期:2015-03-20 14:17:05
发表于 2015-07-20 09:45 |显示全部楼层
回复 3# kingroc711


    可以读取自己的map表,或再指定的位置查找指定文件名的文件时候存在.
    安装好的apk.so都释放再/data/app/packageName/libs下面.这个libs一般是一个软连接,每个系统版本都可能不一样,但是查找的时候不用关心,直接用软连接查找就ok了

论坛徽章:
0
发表于 2015-07-21 16:27 |显示全部楼层
回复 4# rover12421


    实习版主您好:


                  你好像没有看明白我的帖子的意思,或者是我没有写清楚,要不你先看看帖子再做交流,你都回复两贴了。
                  还有您上楼说的.so获取自己的加载位置读取map就可以获得吗?请问android程序中的.so,如何自己读自己的map呢?
     
                                                                                                                                                如何解决不胜感激涕零。

论坛徽章:
39
白银圣斗士
日期:2015-11-24 10:40:40酉鸡
日期:2015-03-20 14:15:44寅虎
日期:2015-03-20 14:13:59午马
日期:2015-03-20 14:13:16白羊座
日期:2015-03-20 14:12:54金牛座
日期:2015-03-20 14:12:09双子座
日期:2015-03-20 14:11:57巨蟹座
日期:2015-03-20 14:11:44狮子座
日期:2015-03-20 14:11:29亥猪
日期:2015-03-20 14:16:24戌狗
日期:2015-03-20 14:16:40申猴
日期:2015-03-20 14:17:05
发表于 2015-07-23 10:28 |显示全部楼层
回复 5# kingroc711


    我说的只是方案只一,做校验并不一定非的要这个方案.
既然你想知道这个方案的具体实现,我就再细说下
要获取自己的map表其实很简单.直接读取`/proc/self/maps`这个文件即可.其中的self也可以用getpid()来活取pid,修改成`/proc/$(pid)/maps`来读取,结果是一样的.
然后就是行遍历,字符串截取了,你看几个maps文件就知道了,里面有当前程序所有加载的动态库文件路径,如果要用maps做校验,观察下就能得出,app的so都是放在`/data/data/$(packageName)/lib`下面,但是再maps可能看到并不是这个文件,但也是有规律的,这个规律和版本也有一定关系.maps显示的路径一般是软连接的真实路径.
比如4.4的是`/data/app-lib/$(packageName)-[1|2]/`,不管这个路径怎么变化,系统的规则里面一定有packageName,简单判断路径中是否有packageName就能做到一次判断,如果要做的跟好,就的精确一点了.

论坛徽章:
52
2015七夕节徽章
日期:2015-08-24 11:17:25ChinaUnix专家徽章
日期:2015-07-20 09:19:30每周论坛发贴之星
日期:2015-07-20 09:19:42ChinaUnix元老
日期:2015-07-20 11:04:38荣誉版主
日期:2015-07-20 11:05:19巳蛇
日期:2015-07-20 11:05:26CU十二周年纪念徽章
日期:2015-07-20 11:05:27IT运维版块每日发帖之星
日期:2015-07-20 11:05:34操作系统版块每日发帖之星
日期:2015-07-20 11:05:36程序设计版块每日发帖之星
日期:2015-07-20 11:05:40数据库技术版块每日发帖之星
日期:2015-07-20 11:05:432015年辞旧岁徽章
日期:2015-07-20 11:05:44
发表于 2015-08-11 15:44 |显示全部楼层
JNI在调用时对文件命名确实有一定的规则,不能随便改。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号 北京市公安局海淀分局网监中心备案编号:11010802020122
广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员  联系我们:wangnan@it168.com
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP