NDK 学习之遇到的问题总结
之前说了使用别人提供的 so 的一种方法,不过由于是第一次做这样的需求,难免会遇到一些问题,所以下面就是这几天 NDK 开发中的一些问题总结,不过可能由于问题情况有限,可能错误分析原因不全面。
1.报错信息: java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader ... couldn't find "libxxx.so"
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,如果还不行,可能还是缺一些其他信息