You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android集成含libc++_shared.so的两个aar库冲突致崩溃求助

解决libc++_shared.so冲突并保证双库正常运行的方案

问题根源

直接用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到项目目录

  1. 从你的NDK安装目录中找到对应架构的libc++_shared.so,路径通常为:
    ${ANDROID_NDK_HOME}/sources/cxx-stl/llvm-libc++/libs/[架构]/libc++_shared.so
  2. 在项目的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
    
  3. 同步项目后,Gradle会自动打包这些so到APK中。

验证方案

  1. 重新构建项目,确认2 files found with path 'lib/arm64-v8a/libc++_shared.so'错误消失。
  2. 测试USB相机和SNPE的核心功能,确保两者都能正常运行无崩溃。

内容的提问来源于stack exchange,提问作者Shan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 07:35:12