NDK 学习之遇到的问题总结

作者: Gzw丶南山 | 来源:发表于2017-08-10 22:06 被阅读436次

    之前说了使用别人提供的 so 的一种方法,不过由于是第一次做这样的需求,难免会遇到一些问题,所以下面就是这几天 NDK 开发中的一些问题总结,不过可能由于问题情况有限,可能错误分析原因不全面。

    1.报错信息: java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader ... couldn't find "libxxx.so"

    • 原因分析:是对应的 so 加载时没找到,所以可能是 so 放错了地方
    • 解决方案:在 app 的 build 文件下的 android 节点添加如下代码:
    sourceSets {
        main {
            jniLibs.srcDirs = ['libs']  
        }
    }
    

    2.报错信息:dlopen failed: library "libc++_shared.so" not found

    • 原因分析:对应的 so 包依赖的 libc++_shared.so 没有找到
    • 解决方案:在 Application.mk 中添加 APP_STL := c++_shared,官方是这么说的:默认情况下,NDK 构建系统为 Android 系统提供的最小 C++ 运行时库 (system/lib/libstdc++.so) 提供 C++ 标头。 此外,它随附您可以在自己的应用中使用或链接的替代 C++ 实现。请使用 APP_STL 选择其中一个。 如需了解有关支持的运行时及其功能的信息,请参阅 NDK 运行时和功能

    3.报错信息:


    image.png
    • 原因分析:项目总存在 c++ 代码,而你的项目还不支持,你需要进行相应的配置
    • 解决方案:进行 .mk 文件配置

    4.报错信息:'string' file not found

    • 原因分析:因为我自己的是 .c 文件,而对方 .h 文件中涉及到 c++ 的用法
    • 解决方案:将自己的 .c 文件后缀改为 .cpp,并在 Application.mk 文件中 添加 APP_STL := c++_shared,还需要让自己的代码被包起来,因为你要使用到 c++ 语法:
    image.png

    5.报错信息:报错信息:Error:(13) undefined reference to 'xxx方法'

    • 原因分析:没有正确的应用到方法
    • 解决方案:在自己的 JNI 模块中添加 LOCAL_ALLOW_UNDEFINED_SYMBOLS := true

    6.报错信息:java.lang.UnsatisfiedLinkError: dlopen failed: "/data/app/.../xxx..so" has unexpected e_type: 1

    • 原因分析: LSB relocatable 这种类型的并不是正确 so 文件, LSB shared object 才是真正的共享库(通过 file xxx.so 查看该信息)
    • 解决方法:让提供 so 包的人重新提供

    7.报错信息:No implementation found for int 包名.类名.方法名() (tried Java_包名类名方法名 and Java_包名类名方法名__)

    • 原因分析:没有对应的方法,可能是没有进行 load 或者命名不符合规范
    • 解决方法:我这里是忘记了 loadLibrary,当然使用 c++ 语法时也有可能会出这种问题

    8.报错信息:dlopen failed: library "工程目录下的xxx.so" not found

    • 原因分析:这是别人帮解决的,问题还是出的 so 编译不正确
    • 解决方法:对方编译 so 加上 -soname,如果还不行,可能还是缺一些其他信息

    相关文章

      网友评论

        本文标题:NDK 学习之遇到的问题总结

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