APP所需的【非.so结尾】的so库文件,怎样安装到安卓手机
最近要开发一个安卓的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相关内容看起来相当的纷繁复杂,一时无从下手改造。
请各位有这方面经验的高手看看能否指点下迷津?