Android调用JNI出错 java.lang.UnsatisfiedLinkError: No implementation found for的解决方法

错误描述

今天在集成第三方库时,发生如下错误

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目录下,怎么会出现这种现象呢?

心路历程

  1. 确保包名正确
    Android调用JNI出错 java.lang.UnsatisfiedLinkError: No implementation found for的解决方法
    这篇文章,主要是java文件包名不正确造成的,我使用的是第三方打包提供的jar和so文件,所以包名问题不存在,况且使用厂家的demo不存在此问题,所以问题应该是公司代码和厂家代码冲突所致。

  2. 确保lib下个目录,so文件数量一致
    关于android某些手机java.lang.UnsatisfiedLinkError: No implementation found for ......的问题

    Android调用JNI出错 java.lang.UnsatisfiedLinkError: No implementation found for的解决方法_第1张图片
    image.png

    将apk解压后查看lib,发现果然so目录文件不一致。libBugly.so在5个目录(腾讯bugly使用的so库),armeabi下,是厂家提供的so库。

解决途径

  1. 提供armv7编译的libA.so放入armeabi-v7a下,补齐各架构所需要的SO。
  2. 把armeabi-v7a目录去掉,默认armv7下也能使用armeabi下的SO。

如上是Bugly官网提供的解决方案。

  1. 厂家无法提供so,抛弃;
  2. 去掉armeabi-v7a等其他目录。可是bugly是使用gradle依赖的方式,默认就会加载所有so文件。

终极方案

在主模块的build.gradle文件,添加如下语句。

    defaultConfig {
        ...
        ndk {
            //设置支持的SO库架构
            abiFilters 'armeabi' //, 'x86', 'armeabi-v7a', 'x86_64', 'arm64-v8a'
        }
    }

重新编译apk,运行,错误不见了,解压apk,查看lib


Android调用JNI出错 java.lang.UnsatisfiedLinkError: No implementation found for的解决方法_第2张图片
image.png

只有armeabi下面存在so文件,问题解决。

参考文章

  1. 精神哥讲Crash(一):UnsatisfiedLinkError
  2. 用了Bugly的库应用启动不了,提示发生UnsatisfiedLinkError异常?
  3. 我的Android进阶之旅】Android调用JNI出错 java.lang.UnsatisfiedLinkError: No implementation found for的解决方法
  4. 关于android某些手机java.lang.UnsatisfiedLinkError: No implementation found for ......的问题

你可能感兴趣的:(Android调用JNI出错 java.lang.UnsatisfiedLinkError: No implementation found for的解决方法)