Android萌新,今天又一次被jni按在地上摩擦。。。记录一下排查问题的过程。
-
调用so库,一般使用 dlopen() 打开第三方so库,如果出现了一直打开失败的情况,这时候不要急,使用dlerror()查看一手错误的原因,目前见过的原因有:
(1)“libxxx.so not found”
so库找不到,基本就是libs目录下的so库没被打包进应用,在build.gradle中的defaultConfig中添加:
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
而且还有更诡异的情况,就是一般libs文件夹下都会建有两个文件夹 armeabi-v7a 和 arm64-v8a,各自放各自架构的so库,或者libs目录下有一个armeabi的文件夹下放置so库,有些设备会出现so库进不去应用的情况,这时候只要在libs目录下只留下设备对应架构的文件夹,问题就解决了。比如你知道自己的设备是armeabi-v7a的架构,就只剩下一个armeabi-v7a的文件夹下面放着so库即可。本来是应该android系统会根据系统架构选择不同路径的so库去调用,结果需要这样操作也是不懂,有空会再钻研一下。
(2)“libXXX.so has bad elf magic”
这是你编译的so库架构跟你运行的平台架构不一致吧。。。确认下吧铁汁。
(3)“dlopen failed: cannot locate symbol "__register_atfork" referenced by "libXXX.so"...”
这个就是坑我一天的东西,我后来经过查询,应该是编译这个so库的ndk版本和你的Android Studio当前的ndk版本不一致,或者是高版本的android平台才能调用的so库(最后我这边确认是第二种情况,在我的手机Android28没问题,在Android22上失败了)导致无法动态链接,可以确认一下。在确认之前你先保证自己可以调用自己的so库,再“理直气壮”“胸有成竹”地去找给你so库的同事,体现的咱们做事很严谨不是?
2.想用c++库的vector?iostream?我现在是ndk-18的版本,编译jni库的方式有两种,ndk-build和cmake,我在被无数百度什么添加APP_STL := stlport_static 坑过之后最终还是选择去看ndk文档说明,发现新版本ndk中,ndk-build是无法使用c++的stl库的,所以在Android Studio中想用vector等库就必须使用cmake的方式啦!顺便指路两个好链接:
Android Studio中Cmake进行JNI开发:https://blog.csdn.net/quwei3930921/article/details/78820991
Cmake多个so库:https://www.jianshu.com/p/f09dbaf72126
继续努力