Невозможно связать встроенную статическую библиотеку с общей библиотекой в ​​Android NDK - PullRequest
0 голосов
/ 17 октября 2018

Дерево AOSP 7.1.1_r50

├── abi
├── art
├── bionic
├── bootable
├── build
├── cts
├── dalvik
├── developers
├── development
├── device
├── docs
├── external
├── frameworks
├── hardware
├── libcore
├── libnativehelper
├── libtest
│   ├── libA
│   └── libB
│   └── libC
│   └── libmytest
│   └── └── Android.mk
│   └── └── my_test.c
│   └── └── curve_test.c
│   └── └── LibSecureTest_Wrapper.cpp
│   └── libsecuretest
│   └── └── arm64-v8a
│   └── └── └── libsecuretest.a
│   └── └── armeabi-v7a
│   └── └── └── libsecuretest.a
│   └── └── Android.mk
├── ndk
├── out
├── packages
├── pdk
├── platform_testing
├── prebuilts
├── sdk
├── system
├── toolchain
└── tools

Я пытаюсь собрать libmytest в качестве разделяемой библиотеки. libmytest необходимо связать с libsecuretest.a , который является предварительно встроенной статической библиотекой.Команда make libsecuretest успешно строится, но когда я выполняю команду make libmytest, команда компоновщика выдает ошибку.Вы можете найти полный журнал вывода здесь .

PS: libsecuretest.a - это библиотека C ++, созданная с использованием NDK.

Вот содержимое Android.mk файла, расположенного в каталоге libmytest :

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)

А вот содержимое Файл Android.mk находится в каталоге libsecuretest :

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)

Я не могу узнать, что именно пропустил.Буду очень признателен за любую помощь.

1 Ответ

0 голосов
/ 17 октября 2018

Ваша проблема, вероятно, из-за того, что вы смешиваете разные STL (версии)

Большая часть вашей "неопределенной ссылки" связана с:

std::__1
std::__ndk1

Как:

out/target/product/generic_arm64/obj/STATIC_LIBRARIES/libsecuretest_intermediates/libsecuretest.a(MyUtils.cpp.o):function MyUtils::Int32toHexString(int, int): error: undefined reference to 'std::__ndk1::locale::locale()'

Пожалуйста, попробуйте также скомпилировать "libsecuretest" со сборкой AOSP (возможно, версии libc ++ отличаются).

ПРИМЕЧАНИЕ:

Я попытался проверить мои символы libc ++ AOSP (PLATFORM_VERSION =6.0.1) и получаю:

$ nm -DC libc++.so | grep 'locale::locale()'
000682ad T std::__1::locale::locale()
000682ad T std::__1::locale::locale()

Также я получаю те же символы с libc ++ с телефонов Pixel2 (Android9) S8 (Andorid 8.0.0)

adb pull /system/lib/libc++.so

[И проверь этос той же самой командой "nm" ...]

Но символы ndk18:

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