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

如何在Android项目中替换NDK默认的libc++_shared.so?

替换NDK自带libc++_shared.so为自定义版本的可行方案

要彻底替换NDK自带的libc++_shared.so,核心是切断构建系统对NDK标准库的自动依赖,同时手动关联自定义库,具体操作如下:

1. 解除NDK自动关联标准库

先在Application.mk里关闭NDK自带的STL自动集成:

APP_STL := none

这会导致C标准库头文件丢失,所以必须在Android.mk里手动添加自定义libc的头文件路径:

# 替换成你自己的自定义libc++头文件目录
LOCAL_C_INCLUDES += /path/to/your/custom/libcxx/include
LOCAL_C_INCLUDES += /path/to/your/custom/libcxxabi/include

2. 手动链接自定义libc++_shared.so

在Android.mk中先引入自定义的预构建库,再让你的Native模块链接它:

# 定义自定义libc++_shared预构建库
include $(CLEAR_VARS)
LOCAL_MODULE := c++_shared
# 按架构指定自定义库路径,TARGET_ARCH_ABI会自动匹配当前构建架构
LOCAL_SRC_FILES := ../jniLibs/$(TARGET_ARCH_ABI)/libc++_shared.so
# 导出头文件路径,确保其他模块能找到标准库头文件
LOCAL_EXPORT_C_INCLUDES := /path/to/your/custom/libcxx/include /path/to/your/custom/libcxxabi/include
include $(PREBUILT_SHARED_LIBRARY)

# 你的Native模块配置,链接自定义的c++_shared
include $(CLEAR_VARS)
LOCAL_MODULE := your-native-lib
LOCAL_SRC_FILES := native-src.cpp
LOCAL_SHARED_LIBRARIES += c++_shared
include $(BUILD_SHARED_LIBRARY)

3. 确保APK打包自定义库

  • 把自定义的libc++_shared.so放到项目的app/src/main/jniLibs/对应架构目录下(比如arm64-v8a、armeabi-v7a等)
  • 在Module级的build.gradle中配置打包规则,彻底排除NDK自带的版本:
android {
    packagingOptions {
        // 排除NDK自动引入的libc++_shared.so
        exclude 'lib/**/libc++_shared.so'
        // 确保优先打包我们放入jniLibs的自定义版本
        pickFirst 'lib/**/libc++_shared.so'
    }
}

4. 验证构建结果

构建后查看日志,如果不再出现[arm64-v8a] "Prebuilt ": "libc++_shared.so <= <NDK>/sources/cxx-stl/llvm-libc++/libs/arm64-v8a/"的输出,就说明NDK自带版本已经被排除。解压APK检查lib/对应架构/下的libc++_shared.so,确认是自己的自定义版本即可。

注意事项

  • 自定义libc++的API级别必须和项目使用的NDK API级别匹配,否则会出现运行时崩溃
  • 所有Native模块都必须链接这个自定义的libc++_shared,不能混合使用不同版本的标准库
  • 如果用CMake构建,需要在CMakeLists.txt中通过include_directories指定自定义头文件,用add_library引入预构建库,再通过target_link_libraries链接到目标模块

内容的提问来源于stack exchange,提问作者Alexey S. Larionov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 12:47:05