Использование предварительно построенных статических библиотек для разработки Android NDK

Я пытаюсь создать приложение для Android, которое использует статические библиотеки из какого-либо существующего кода на языке C ++. Как бы то ни было, я не могу что-то строить, вот шаги, которые я предпринял до сих пор.

У меня есть ndk-r5b и вы создали автономную toolchain в соответствии с ndk / docs / STANDALINE-TOOLCHAIN.html. Затем я использовал автономный компилятор toolchain (arm-linux-androideabi-g ++) вместо g ++ для флага CXX в Makefile, который компилирует необходимые мне статические библиотеки. Это компилируется без ошибок и создается 3 статических библиотеки. Ниже приведен фрагмент кода некоторых флагов, используемых для создания готовых библиотек:

CXX = arm-linux-androideabi-g++ SYSTEM_LIBS = -lstdc++ -lm INCLUDE_PATH += ${NDK_PATH}/platforms/android-8/arch-arm/usr/include/ 

Вот пример строки, которая создается из файла makefile при компиляции:

 arm-linux-androideabi-g++ -c -DTIME_SIM -I./include -I/home/greg/dev/Android/android-ndk-r5b/platforms/android-8/arch-arm/usr/include/ -fpic -ggdb3 -SimTime.C -o SimTime.o 

Затем я создаю приложение, используя ndk-build, используя следующее для Android.mk:

 LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := engine LOCAL_SRC_FILES := ../libs/libEngine.a include $(PREBUILT_STATIC_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE := shmem LOCAL_SRC_FILES := ../libs/libShMem.a include $(PREBUILT_STATIC_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE := util LOCAL_SRC_FILES := ../libs/libUtil.a include $(PREBUILT_STATIC_LIBRARY) # build server as a shared library include $(CLEAR_VARS) LOCAL_MODULE := libServer LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../include LOCAL_SRC_FILES := \ Server.C \ Router.C \ RouterMsgs.C \ Federation.C \ cripName.C \ ver.C \ JNIWrapper.cpp LOCAL_STATIC_LIBRARIES := engine shmem util include $(BUILD_SHARED_LIBRARY) 

Предварительно созданные библиотеки компилируются с использованием автономного компилятора toolchain, указанного в android ndk. Однако существует множество нерешенных ссылок на ostream при связывании разделяемой библиотеки с предварительно построенными библиотеками с использованием ndk-build. Например:

 /home/android/obj/local/armeabi/libShMem.a(SubscriptionItem.o): In function `SUBSCRIPTION_ITEM::Print(std::basic_ostream<char, std::char_traits<char> >&)':/home/src/comm/SubscriptionItem.C:97: undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)' 

Я предполагаю, что я пропускаю некоторые важные флаги или не делаю что-то правильно, когда компилирую с помощью автономного компилятора, но любая помощь или проницательность в этом вопросе была бы очень признательна, поскольку я не могу найти этот ответ на google или в любом из андроидов ndk Docs. Благодаря!

Solutions Collecting From Web of "Использование предварительно построенных статических библиотек для разработки Android NDK"

Ну, вы можете исправить это, создав файл Application.mk в той же папке, что и файл Android.mk, содержащий:

 APP_STL := stlport_static 

Для использования статического stlport, который находится внутри Android NDK.

У меня была такая же проблема, и я решил, добавив модуль для стандартной библиотеки C ++. Библиотека, связанная с системой ndk-build, находится в неправильном месте (платформы / android-9 / arch-arm / usr / lib в моем случае).

 include $(CLEAR_VARS) LOCAL_MODULE := rightstdc LOCAL_SRC_FILES := <path to the correct libstdc++.a> include $(PREBUILT_STATIC_LIBRARY) 

Добавьте тег модуля в список статических библиотек:

 LOCAL_STATIC_LIBRARIES := engine shmem util rightstdc 

build/core/build-binary.mk -L$(SYSROOT)/usr/lib если какие-либо библиотеки указаны в LOCAL_LDLIBS, но в моем случае это неправильный путь.

Я не знаю, есть ли отсутствующий шаг, который должен скопировать правильный libstdc ++ в это место, но описанный выше подход будет работать.