8 votes

l'utilisation de bibliothèques statiques préconstruites pour le développement d'Android NDK

J'essaie de créer une application Android qui utilise des bibliothèques statiques à partir d'un code c++ existant. Cependant, je ne parviens pas à construire les choses, voici les étapes que j'ai suivies jusqu'à présent

J'ai ndk-r5b et j'ai construit la chaîne d'outils autonome selon ndk/docs/STANDALINE-TOOLCHAIN.html. J'ai ensuite utilisé le compilateur de la chaîne d'outils autonome (arm-linux-androideabi-g++) au lieu de g++ pour le drapeau CXX dans le Makefile qui compile les bibliothèques statiques dont j'ai besoin. La compilation s'est faite sans erreur et il y a 3 bibliothèques statiques produites. Voici un extrait de code de certains des drapeaux utilisés pour construire les bibliothèques pré-construites :

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

Voici un exemple de ligne qui est produite par le makefile lors de la compilation :

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

Ensuite, je construis l'application en utilisant ndk-build en utilisant ce qui suit pour 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)

Les bibliothèques préconstruites se compilent bien en utilisant le compilateur de la chaîne d'outils autonome fourni dans le kit de développement Android. Cependant, il y a de nombreuses références non résolues à ostream lorsque l'on lie la bibliothèque partagée aux bibliothèques préconstruites en utilisant ndk-build. Par exemple :

/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*)'

Je suppose qu'il me manque des drapeaux importants ou que je ne fais pas quelque chose de correct lorsque je compile en utilisant le compilateur autonome, mais toute aide ou idée sur ce problème serait grandement appréciée car je ne semble pas trouver cette réponse sur Google ou dans l'une des docs Android ndk. Merci !

3voto

Christoph Martens Points 267

Eh bien, vous pouvez résoudre ce problème en créant une Application.mk dans le même dossier que le fichier Android.mk, contenant :

APP_STL := stlport_static

pour utiliser le stlport statique qui se trouve dans le NDK Android.

1voto

Kevin Beck Points 43

J'ai eu le même problème et je l'ai résolu en ajoutant un module pour la bibliothèque standard C++. La bibliothèque liée par le système ndk-build se trouve au mauvais endroit (platforms/Android-9/arch-arm/usr/lib dans mon cas).

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

Ajouter la balise module à la liste des bibliothèques statiques :

LOCAL_STATIC_LIBRARIES := engine shmem util rightstdc

El build/core/build-binary.mk Prépare -L$(SYSROOT)/usr/lib si des bibliothèques sont spécifiées dans LOCAL_LDLIBS mais dans mon cas, c'est le mauvais chemin.

Je ne sais pas s'il y a une étape manquante qui devrait copier la bonne libstdc++ à cet endroit mais l'approche ci-dessus fonctionnera.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X