Estoy intentando construir una aplicación para Android que use bibliotecas estáticas de algún código existente de C++. Sin embargo, parece que no puedo hacer que las cosas funcionen, estos son los pasos que he tomado hasta ahora:usando librerías estáticas prediseñadas para desarrollo Android NDK
Tengo ndk-r5b y he construido la cadena de herramientas independiente según ndk/docs/STANDALINE-TOOLCHAIN.html. Luego utilicé el compilador independiente de toolchain (arm-linux-androideabi-g ++) en lugar de g ++ para el indicador CXX en el archivo Makefile que compila las bibliotecas estáticas que necesito. Esto se compila sin errores y hay 3 bibliotecas estáticas producidas. Aquí es un fragmento de código de algunas de las banderas utilizadas para construir las bibliotecas prediseñados:
CXX = arm-linux-androideabi-g++
SYSTEM_LIBS = -lstdc++ -lm
INCLUDE_PATH += ${NDK_PATH}/platforms/android-8/arch-arm/usr/include/
que aquí hay una línea de muestra que se produce desde el makefile al compilar:
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
siguiente que construir el aplicación utilizando NDK-construye utilizando la siguiente para 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)
las bibliotecas prediseñados compilarse bien el uso de la cadena de herramientas del compilador independiente dada en el andro id ndk. Sin embargo, hay muchas referencias no resueltas a ostream al vincular la biblioteca compartida a las bibliotecas preconstruidas utilizando ndk-build. Para exampe:
/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*)'
Asumo que me falta algunas banderas importantes o no hacer algo correcto cuando soy compilar con el compilador independiente pero cualquier ayuda o conocimiento sobre este tema sería muy apreciada ya que parece que no puede encontrar este respuesta en google o en cualquiera de los documentos de android ndk. ¡Gracias!
No estoy tan seguro de que esta sea una buena idea. Si construye una biblioteca completamente enlazada estáticamente que depende de libstdC++, terminará incluyendo una copia de esas funciones en la biblioteca. Pero cuando carga la biblioteca en el teléfono, la cargará en un proceso que ya tiene una asignación compartida de libstdC++ que la aplicación heredó cuando se bifurcó de zygote. Esto es, como mínimo, desperdicio. ¿Podría ser mejor usar el indicador de compilación para permitir que las bibliotecas tengan dependencias insatisfechas? –