美文网首页
Android调用JNI出错 java.lang.Unsatis

Android调用JNI出错 java.lang.Unsatis

作者: chenzhenlindx | 来源:发表于2018-03-16 13:30 被阅读752次

    错误描述

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

    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 ......的问题

      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


    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.Unsatis

          本文链接:https://www.haomeiwen.com/subject/ivilqftx.html