声明
本文仅用以记录个人针对该问题的猜测及处理办法,欢迎交流探讨,但若由于采用或借鉴此方法而导致的任何问题,本人不承担任何责任。
目录
问题描述
在qt下开发安卓端的一个应用,调试一款社保读卡器过程中,调用aar时出现加载so失败
解决思路
在网上搜索了下,大致都是android studio下的aar加载so的问题,有相关性,但可参考信息不够,不过这里整理下,大致意思以下几种:
1. 添加aar后,clean再make,试过,但问题依旧
2. aar中要System.loadLibrary()来调用so库,这个我在看aar中java文件里调用部分,这里是有的,问题不在这儿
3. so库文件放的位置不对,这个跟我这个问题不搭边,aar库在原本的安卓demo下工作正常
所以我的思路一个是就事论事,问题在哪儿从哪儿解决,一个是换个思路;
不过在没有头绪的情况下,我尝试换个思路,直接调用so文件,原则上应该没问题,参考aar里的调用方法就可以;
步骤:
1. 用压缩包打开aar文件,将jni中的两个文件夹拖出来,里面就是so的库文件
2. 将so放到项目的lib依赖目录下,并在pro中添加进去
ANDROID_ABIS= armeabi-v7a arm64-v8a
for(abi,ANDROID_ABIS):{
ANDROID_EXTRA_LIBS = $$PWD/android/libs/$${abi}/libreader.so
LIBS += -L$$PWD/android/libs/$${abi} -lreader
}
3. 代码里根据aar中java的方法去调用
4. 编译
但是,最后在编译这步又出了问题,函数未定义;这个问题咋说呢,厂家做全平台时,安卓的so也用的java,入参是java的,这里没法直接去用,符号直接给过滤掉了(比如String,qt里给java是jstring,但这么用符号不对)。
折腾了一下,又回到起点,还是直接用aar吧,不过这次重新编译竟然可以了,所以怀疑是不是得显式在qt里把so放进去才行(因为改会直接用aar时,我没有移除上面添加的so文件),不过好在可以用了。
所以我整理下,解决方法是,把aar中的so单独拎出来显式给pro管理
各位有遇到的没,可以留言讨论下