集成第三方so时,build.gradle中需要有如下配置,否则so包不能打进APK中:
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
将第三方so包按照cpu架构,复制进libs中:
运行程序,加载动态链接库时,如报如下错误:
dlopen failed: library "libc++_shared.so" not found
如下链接错误分析得当,但是并不能解决问题
NDK 学习之遇到的问题总结
如果项目是使用CMake插件构建的NDK,则在模块的build.gradle,defaultConf中添加如下代码,则与上面链接中所提到的解决办法等效.
externalNativeBuild {
cmake {
arguments "-DANDROID_STL=c++_shared"
}
}
不能解决的原因是:添加的构建参数,是影响动态链接库编译过程的,而引入第三方so包,是已经编译完成的.
解决办法:
既然对应的 so 包依赖的 libc++_shared.so 没有找到,那么在自己的模块中触发一下ndk编译过程,编译出libc++_shared.so,这样问题就解决了.
自己的c/c++代码不用任何业务逻辑,其目的只是触发ndk构建,取HelloJnidemo中代码即可.
build.gradle中android节点添加:
externalNativeBuild {
cmake {
path "src/main/cpp/CMakeLists.txt"
version "3.10.2"
}
}
build.gradle中config节点添加:
externalNativeBuild {
cmake {
arguments "-DANDROID_STL=c++_shared"
}
}
将HelloJni中CMakeLists.txt和hello-jni.c复制到src/main/cpp目录中.
构建项目,触发ndk构建过程,再次加载第三方so库即可.
构建后生成的libc++_shared.so靓照如下: