kingroc711 发表于 2015-07-18 11:02

[Android] 请教android对so库的加载与调用

本帖最后由 kingroc711 于 2015-07-18 16:09 编辑

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

rover12421 发表于 2015-07-18 14:00

android4.x之后已经限制so不能从sdcard加载,但是可以从其他目录加载.
so库不是简单的改一个字符串就行的.
如果加载成功,调用出错,那说明确实做了位置判断,不过真的很少会有这样的需求,一般常见的是会做包名判断,自身完整性校验

kingroc711 发表于 2015-07-18 16:03

回复 2# rover12421


    您好:

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

rover12421 发表于 2015-07-20 09:45

回复 3# kingroc711


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

kingroc711 发表于 2015-07-21 16:27

回复 4# rover12421


    实习版主您好:


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

rover12421 发表于 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)-/`,不管这个路径怎么变化,系统的规则里面一定有packageName,简单判断路径中是否有packageName就能做到一次判断,如果要做的跟好,就的精确一点了.

renxiao2003 发表于 2015-08-11 15:44

JNI在调用时对文件命名确实有一定的规则,不能随便改。
页: [1]
查看完整版本: [Android] 请教android对so库的加载与调用