APP所需的【非.so结尾】的so库文件,怎样安装到安卓手机

deepsmart 2016-06-10 04:45:49
最近要开发一个安卓的OTG外设的相关通讯程序,用到了libusb开源包。
我们在libusb基础上的纯C语言版通讯协议在手机(已root)的纯linux环境下,能够正常跑通。
现在准备用NDK将通信协议封装为JNI接口给我们上层APP的java代码。
但是碰到一个问题,求各路热心人指点。

就是,
交叉编译libusb出来的两个arm平台的共享库:libusb-1.0.so 和 libusb-0.1.so,
由于linux共享库版本控制的默认规则,其soname都是【非.so结尾】。
其soname分别是:libusb-1.0.so.0 和 libusb-0.1.so.4
也就是说,安卓手机中必须有 文件名与soname完全一致的库存在,我们底层so和上层APP才能调用这些库。
而且考虑到将来用户实际安装APP时应该是普通权限,且一键安装不需要人工干预。

现在,将通信协议封装为JNI接口时,问题来了:
用过 Androd Studio 1.5,
根本不支持把libs下【非.so结尾】的库文件打包到APK,试过.so和.so.x一起打成jar放在libs下,也还是进不了APK包。
换用 Androd Studio 2.1,
虽然也不支持把libs下【非.so结尾】的库文件打包到APK,但还能够支持将libs下的jar包内的文件复制进APK中。
但问题是,手机端安装APK时,APK内【非.so结尾】的库文件还是不能自动被拷到手机的/data/app/应用名/lib/arm下。

无奈,其他能想到的招有2个,但也似乎不好用。
(1)、在APP的java代码中,程序执行时将/data/app/应用名/lib/arm目录下的.so库复制一份为【非.so结尾】名的库。
但苦于/data/app/下需要system用户组权限,APP程序本身权限不够,不能在其中随意写。
(2)、重新交叉编译libusb,将其编译参数设为soname为.so结尾的形式。
但是其configure和makefile相关内容看起来相当的纷繁复杂,一时无从下手改造。

请各位有这方面经验的高手看看能否指点下迷津?
...全文
753 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
Joeker 2016-06-21
  • 打赏
  • 举报
回复
楼主热心肠呀
deepsmart 2016-06-12
  • 打赏
  • 举报
回复
后来发现soname是属于ldconfig该干的活。 在源码包根目录的configure文件中搜索“ldconfig”,找到自己目标平台的那一段,比如我的如下: linux* | k*bsd*-gnu | kopensolaris*-gnu) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix……' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' 将上述soname_spec这行改为:soname_spec='${libname}${release}${shared_ext}' 然后重新configure 和 make, make install即可。

1,318

社区成员

发帖
与我相关
我的任务
社区描述
主要是开发驱动技术
社区管理员
  • 驱动程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧