错误描述
今天在集成第三方库时,发生如下错误
AndroidRuntime: FATAL EXCEPTION: Thread-4903
Process: com.hxct.home, PID: 24487
java.lang.UnsatisfiedLinkError: No implementation found for void com.gqt.codecs.AmrNB.close() (tried Java_com_gqt_codecs_AmrNB_close and Java_com_gqt_codecs_AmrNB_close__)
at com.gqt.codecs.AmrNB.close(Native Method)
at com.gqt.media.RtpStreamSender_group.run(RtpStreamSender_group.java:978)
根据日志,应该是找不到native方法,可是对应的so文件都已经考到了jniLibs
目录下,怎么会出现这种现象呢?
心路历程
-
确保包名正确
Android调用JNI出错 java.lang.UnsatisfiedLinkError: No implementation found for的解决方法
这篇文章,主要是java文件包名不正确造成的,我使用的是第三方打包提供的jar和so文件,所以包名问题不存在,况且使用厂家的demo不存在此问题,所以问题应该是公司代码和厂家代码冲突所致。 -
确保lib下个目录,so文件数量一致
image.png
关于android某些手机java.lang.UnsatisfiedLinkError: No implementation found for ......的问题
将apk解压后查看lib,发现果然so目录文件不一致。libBugly.so在5个目录(腾讯bugly使用的so库),armeabi下,是厂家提供的so库。
解决途径
- 提供armv7编译的libA.so放入armeabi-v7a下,补齐各架构所需要的SO。
- 把armeabi-v7a目录去掉,默认armv7下也能使用armeabi下的SO。
如上是Bugly官网提供的解决方案。
- 厂家无法提供so,抛弃;
- 去掉armeabi-v7a等其他目录。可是bugly是使用gradle依赖的方式,默认就会加载所有so文件。
终极方案
在主模块的build.gradle
文件,添加如下语句。
defaultConfig {
...
ndk {
//设置支持的SO库架构
abiFilters 'armeabi' //, 'x86', 'armeabi-v7a', 'x86_64', 'arm64-v8a'
}
}
重新编译apk,运行,错误不见了,解压apk,查看lib
image.png
只有armeabi下面存在so文件,问题解决。
网友评论