Android集成含libc++_shared.so的两个aar库冲突致崩溃求助
问题根源
直接用packagingOptions { pickFirst }会导致其中一个库加载版本不兼容的libc++_shared.so——不同NDK版本编译的libc++_shared.so存在符号差异,混用会引发运行时崩溃(比如你遇到的crash64dump)。
正确解决方案:统一使用单一版本的libc++_shared.so
核心思路是排除两个aar自带的libc++_shared.so,转而引入一个与两个库编译环境兼容的统一版本。
步骤1:排除aar中的冲突so
在app模块的build.gradle中,引入两个aar时排除所有架构下的libc++_shared.so:
dependencies { // 排除libuvccamera中的libc++_shared.so implementation(name: 'libuvccamera-release', ext: 'aar') { exclude fileTree(dir: 'lib/arm64-v8a', includes: ['libc++_shared.so']) exclude fileTree(dir: 'lib/armeabi-v7a', includes: ['libc++_shared.so']) exclude fileTree(dir: 'lib/x86', includes: ['libc++_shared.so']) exclude fileTree(dir: 'lib/x86_64', includes: ['libc++_shared.so']) // 其他用到的架构同理 } // 排除snpe中的libc++_shared.so implementation(name: 'snpe-release', ext: 'aar') { exclude fileTree(dir: 'lib/arm64-v8a', includes: ['libc++_shared.so']) exclude fileTree(dir: 'lib/armeabi-v7a', includes: ['libc++_shared.so']) exclude fileTree(dir: 'lib/x86', includes: ['libc++_shared.so']) exclude fileTree(dir: 'lib/x86_64', includes: ['libc++_shared.so']) // 其他用到的架构同理 } }
步骤2:引入统一版本的libc++_shared.so
有两种可靠方式:
方式A:通过NDK配置自动引入
如果项目使用CMake或ndk-build,直接在build.gradle中指定使用c++_shared,Gradle会自动引入对应NDK版本的libc++_shared.so:
android { defaultConfig { // 如果用CMake externalNativeBuild { cmake { arguments "-DANDROID_STL=c++_shared" cppFlags "-std=c++17" // 匹配库编译时的C++版本,根据实际情况调整 } } // 如果用ndk-build // ndk { // stl "c++_shared" // } } }
注意:要保证项目使用的NDK版本与两个aar编译时的NDK版本尽量一致(比如两个aar都用NDK r25编译,项目也用r25),避免版本差异导致的兼容问题。
方式B:手动复制so到项目目录
- 从你的NDK安装目录中找到对应架构的
libc++_shared.so,路径通常为:${ANDROID_NDK_HOME}/sources/cxx-stl/llvm-libc++/libs/[架构]/libc++_shared.so - 在项目的
src/main/下创建jniLibs目录,然后按架构分类存放so:src/main/jniLibs/ arm64-v8a/ libc++_shared.so armeabi-v7a/ libc++_shared.so x86/ libc++_shared.so x86_64/ libc++_shared.so - 同步项目后,Gradle会自动打包这些so到APK中。
验证方案
- 重新构建项目,确认
2 files found with path 'lib/arm64-v8a/libc++_shared.so'错误消失。 - 测试USB相机和SNPE的核心功能,确保两者都能正常运行无崩溃。
内容的提问来源于stack exchange,提问作者Shan
相关产品推荐
相关产品推荐

