использование готовых статических библиотек для разработки Android NDK - PullRequest
8 голосов
/ 22 июня 2011

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

У меня есть ndk-r5b и я построил автономный набор инструментов согласно ndk / docs / STANDALINE-TOOLCHAIN.html.Затем я использовал автономный компилятор цепочки инструментов (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/

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

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

NextЯ создаю приложение, используя 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)

Предварительно собранные библиотеки прекрасно компилируются с помощью автономного компилятора цепочки инструментов, приведенного в 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 или в любом из документов Android ndk.Спасибо!

Ответы [ 2 ]

3 голосов
/ 12 сентября 2012

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

APP_STL := stlport_static

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

1 голос
/ 23 сентября 2011

У меня была та же проблема, и я решил ее, добавив модуль для стандартной библиотеки 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 ++ в это место, но описанный выше подход будет работать.

...