2011-06-22 11 views
8

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!

+0

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? –

Respuesta

1

Tuve el mismo problema y lo resolví agregando un módulo para la biblioteca estándar de C++. La biblioteca enlazada por el sistema ndk-build es de una ubicación incorrecta (plataformas/android-9/arch-arm/usr/lib en mi caso).

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

agregar la etiqueta de módulo a la lista de bibliotecas estáticas:

LOCAL_STATIC_LIBRARIES := engine shmem util rightstdc 

Los build/core/build-binary.mk antepone -L$(SYSROOT)/usr/lib si ninguna biblioteca se especifican en LOCAL_LDLIBS pero en mi caso que es el camino equivocado.

No sé si falta un paso que debería copiar la libstdC++ correcta a esa ubicación, pero el enfoque anterior funcionará.

+0

Agregue su información relacionada con la biblioteca C++ en Application.mk junto con algunas banderas cpp –

3

Bueno, en realidad se puede arreglar eso con la creación de un archivo Application.mk dentro de la misma carpeta que el archivo es Android.mk, que contiene:

APP_STL := stlport_static 

para el uso de la STLport estático que se encuentra en el interior el NDK de Android.