之前说了使用别人提供的 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.报错信息:
- 原因分析:项目总存在 c++ 代码,而你的项目还不支持,你需要进行相应的配置
- 解决方案:进行 .mk 文件配置
4.报错信息:'string' file not found
- 原因分析:因为我自己的是 .c 文件,而对方 .h 文件中涉及到 c++ 的用法
- 解决方案:将自己的 .c 文件后缀改为 .cpp,并在 Application.mk 文件中 添加 APP_STL := c++_shared,还需要让自己的代码被包起来,因为你要使用到 c++ 语法:
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,如果还不行,可能还是缺一些其他信息