使用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
相关产品推荐
相关产品推荐

