添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
精彩文章免费看

NDK 学习之遇到的问题总结

之前说了使用别人提供的 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.报错信息:

  • 解决方案:在自己的 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,如果还不行,可能还是缺一些其他信息
  • 最后编辑于:2017-12-09 23:41