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

使用NDK编译的第三方SO库在AOSP构建时遇链接错误求助

问题原因

报错(native:ndk:libc++:shared) should not link to libutils (native:platform)是AOSP构建系统的跨域链接限制导致的:

  • 你引入的libc++_shared.so属于NDK runtime组件,遵循NDK构建规则
  • libutils是AOSP平台原生库,依赖AOSP自带的STL实现
    两者分属不同构建域,AOSP禁止这种混合链接,避免STL版本冲突、依赖不兼容等运行时问题。
解决方案

根据你的需求选择对应方案:

方案1:移除libutils依赖(优先推荐,若代码未用到)

检查代码是否真的需要libutils的API(比如String8、android::Vector等),如果没有用到,直接从LOCAL_SHARED_LIBRARIES中删除libutils即可:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_C_INCLUDES := $(LOCAL_PATH)/include \

LOCAL_LDFLAGS += $(LOCAL_PATH)/lib/libfastcdr.so \
    $(LOCAL_PATH)/lib/libfastrtps.so \
    $(LOCAL_PATH)/lib/libfoonathan_memory-0.7.1.so \
    $(LOCAL_PATH)/lib/libc++_shared.so

# 移除libutils,仅保留liblog
LOCAL_SHARED_LIBRARIES += \
    liblog 

LOCAL_MODULE := ddsserver

LOCAL_SRC_FILES := \
        HelloWorldPublisher.cpp \
        HelloWorld_main.cpp \
        HelloWorldSubscriber.cpp
LOCAL_INIT_RC := ddsserver.rc

LOCAL_LDFLAGS += -Wl,--hash-style=both
LOCAL_CFLAGS := -Wno-error=non-virtual-dtor -fexceptions -Wno-unused-parameter

LOCAL_NDK_STL_VARIANT := c++_shared
LOCAL_SDK_VERSION := current
include $(BUILD_EXECUTABLE)

方案2:改用AOSP平台STL(若必须使用libutils)

如果代码确实依赖libutils,则需要放弃NDK的c++_shared,改用AOSP平台自带的STL,同时注意第三方SO必须用AOSP构建系统重新编译(否则会因STL不兼容崩溃):

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_C_INCLUDES := $(LOCAL_PATH)/include \

# 移除NDK的libc++_shared,使用平台STL
LOCAL_LDFLAGS += $(LOCAL_PATH)/lib/libfastcdr.so \
    $(LOCAL_PATH)/lib/libfastrtps.so \
    $(LOCAL_PATH)/lib/libfoonathan_memory-0.7.1.so

LOCAL_SHARED_LIBRARIES += \
    liblog \
    libutils 

LOCAL_MODULE := ddsserver

LOCAL_SRC_FILES := \
        HelloWorldPublisher.cpp \
        HelloWorld_main.cpp \
        HelloWorldSubscriber.cpp
LOCAL_INIT_RC := ddsserver.rc

LOCAL_LDFLAGS += -Wl,--hash-style=both
LOCAL_CFLAGS := -Wno-error=non-virtual-dtor -fexceptions -Wno-unused-parameter

# 移除NDK_STL_VARIANT,使用AOSP默认平台STL
LOCAL_SDK_VERSION := current
include $(BUILD_EXECUTABLE)

方案3:替换libutils功能为NDK等价API(若无法重新编译第三方SO)

如果第三方SO只能用NDK编译,又需要部分libutils的功能,可以用NDK提供的标准API替换:

  • 用std::string替代android::String8
  • 用std::vector替代android::Vector
  • 日志功能保留liblog(NDK和AOSP都兼容该库)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 16:36:23