Android ndk 无法将预构建的静态库与Android NDK中的共享库链接 AOSP 7.1.1_r50树

Android ndk 无法将预构建的静态库与Android NDK中的共享库链接 AOSP 7.1.1_r50树,android-ndk,linker,static-libraries,android-source,static-linking,Android Ndk,Linker,Static Libraries,Android Source,Static Linking,我正在尝试将libmytest构建为共享库。 libmytest需要链接到libsecuretest.a这是一个预构建的静态库。 makelibsecuretest命令成功生成,但当我执行makelibmytest命令时,链接器命令出现失败错误。您可以找到完整的输出日志 P: LBSeCURESTest.A是用NDK构建的C++库。 以下是位于libmytest目录中的Android.mk文件的内容: LOCAL_PATH := $(call my-dir) include $(CLEAR

我正在尝试将libmytest构建为共享库。 libmytest需要链接到libsecuretest.a这是一个预构建的静态库。
makelibsecuretest
命令成功生成,但当我执行
makelibmytest
命令时,链接器命令出现失败错误。您可以找到完整的输出日志

<强> P:<强> LBSeCURESTest.A是用NDK构建的C++库。 以下是位于libmytest目录中的Android.mk文件的内容:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := libmytest

LOCAL_SRC_FILES := \
curve_test.c \
my_test.c \
LibSecureTest_Wrapper.cpp

LOCAL_C_INCLUDES := \
$(LOCAL_PATH) \
$(LOCAL_PATH)/../include \
$(LOCAL_PATH)/../../emulator/include

LOCAL_CFLAGS := -DANDROID -g -DTA_PLUGIN

LOCAL_CPPFLAGS := -std=c++11
LOCAL_CPP_EXTENSION := .cpp
LOCAL_NDK_STL_VARIANT := c++_static

LOCAL_SHARED_LIBRARIES := libc libstdc++ libA libB libC
LOCAL_STATIC_LIBRARIES := libsecuretest

ifeq ($(TARGET_ARCH),arm)
LOCAL_LDFLAGS := -Wl,--hash-style=sysv
endif

include $(BUILD_SHARED_LIBRARY)
LOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := libsecuretest
LOCAL_MODULE_CLASS := STATIC_LIBRARIES
LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libsecuretest.a
LOCAL_MODULE_SUFFIX := .a
LOCAL_MODULE_TAGS := optional
include $(BUILD_PREBUILT)
下面是位于libsecuretest目录中的Android.mk文件的内容:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := libmytest

LOCAL_SRC_FILES := \
curve_test.c \
my_test.c \
LibSecureTest_Wrapper.cpp

LOCAL_C_INCLUDES := \
$(LOCAL_PATH) \
$(LOCAL_PATH)/../include \
$(LOCAL_PATH)/../../emulator/include

LOCAL_CFLAGS := -DANDROID -g -DTA_PLUGIN

LOCAL_CPPFLAGS := -std=c++11
LOCAL_CPP_EXTENSION := .cpp
LOCAL_NDK_STL_VARIANT := c++_static

LOCAL_SHARED_LIBRARIES := libc libstdc++ libA libB libC
LOCAL_STATIC_LIBRARIES := libsecuretest

ifeq ($(TARGET_ARCH),arm)
LOCAL_LDFLAGS := -Wl,--hash-style=sysv
endif

include $(BUILD_SHARED_LIBRARY)
LOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := libsecuretest
LOCAL_MODULE_CLASS := STATIC_LIBRARIES
LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libsecuretest.a
LOCAL_MODULE_SUFFIX := .a
LOCAL_MODULE_TAGS := optional
include $(BUILD_PREBUILT)

我不知道我到底错过了什么。非常感谢您的帮助。

您的问题可能是因为您混合了不同的STL(版本)

您的大多数“未定义引用”与以下内容有关:

std::__1
std::__ndk1
比如:

请尝试使用AOSP构建来编译“libsecuretest”(可能libc++版本有所不同)

注:

我尝试检查我的AOSP libc++符号(平台版本=6.0.1),并获得:

我还用libc++从手机Pixel2(Android9)S8(android 8.0.0)中获得了相同的符号

[并使用相同的“nm”命令进行检查…]

但ndk18的符号是:

$nm -DC libc++_shared.so | grep 'locale::locale()'
00000000000865b0 T std::__ndk1::locale::locale()
00000000000865b0 T std::__ndk1::locale::locale()

您的问题可能是因为您混合了不同的STL(版本)

您的大多数“未定义引用”与以下内容有关:

std::__1
std::__ndk1
比如:

请尝试使用AOSP构建来编译“libsecuretest”(可能libc++版本有所不同)

注:

我尝试检查我的AOSP libc++符号(平台版本=6.0.1),并获得:

我还用libc++从手机Pixel2(Android9)S8(android 8.0.0)中获得了相同的符号

[并使用相同的“nm”命令进行检查…]

但ndk18的符号是:

$nm -DC libc++_shared.so | grep 'locale::locale()'
00000000000865b0 T std::__ndk1::locale::locale()
00000000000865b0 T std::__ndk1::locale::locale()

注意:对于“未定义对“\uuu系统\u属性\u获取”的引用,您还有一个问题。注意:对于“未定义对”\uu系统\u属性\u获取”的引用,您还有一个问题。这种构建无法完成。NDK的libc++和平台的libc++按照不同的时间表更新,可能有不同的ABI。NDK静态库不应链接到平台库中。这种构建无法完成。NDK的libc++和平台的libc++按照不同的时间表更新,可能有不同的ABI。NDK静态库不应链接到平台库。