2011-01-22 14 views
11

Comencé creando bibliotecas como bibliotecas compartidas, pero consideré que sería más eficiente crear una biblioteca compartida y el resto estático. Cuando todo fue compartido, se compiló y se vinculó muy bien, pero pasando a estático, sigo vinculando "referencia indefinida".Android NDK, dos bibliotecas estáticas y Vinculación

Editar: construyo todas las bibliotecas en una Android.mk

Android.mk:

MY_LOCAL_PATH := $(call my-dir) 
MY_LOCAL_CFLAGS := -DDEBUG 

TARGET_PLATFORM := 'android-4' 

LOCAL_PATH := $(MY_LOCAL_PATH)/../../Base 

include $(CLEAR_VARS) 

LOCAL_MODULE  := Base 
LOCAL_SRC_FILES := <Base src files> 
include $(BUILD_STATIC_LIBRARY) 

MY_LOCAL_STATIC_LIBRARIES := Base 

MY_LOCAL_C_INCLUDES := $(MY_LOCAL_PATH)/../../Base 

LOCAL_PATH := $(MY_LOCAL_PATH)/../../Framework 

include $(CLEAR_VARS) 

LOCAL_MODULE  := Framework 
LOCAL_C_INCLUDES := $(MY_LOCAL_C_INCLUDES) 
LOCAL_SRC_FILES := <Framework src files> 
LOCAL_CFLAGS := $(MY_LOCAL_CFLAGS) 

include $(BUILD_STATIC_LIBRARY) 

MY_LOCAL_STATIC_LIBRARIES += Framework 

MY_LOCAL_C_INCLUDES += $(MY_LOCAL_PATH)/../../Framework 

LOCAL_PATH := $(MY_LOCAL_PATH)/Graphics 

include $(CLEAR_VARS) 

LOCAL_MODULE := Graphics 
LOCAL_SRC_FILES := <Graphics src files> 
LOCAL_EXPORT_LDLIBS := -lGLESv1_CM 
LOCAL_CFLAGS := $(MY_LOCAL_CFLAGS) 
LOCAL_C_INCLUDES := $(MY_LOCAL_C_INCLUDES) 

include $(BUILD_STATIC_LIBRARY) 

MY_LOCAL_STATIC_LIBRARIES += Graphics 

MY_LOCAL_C_INCLUDES += $(MY_LOCAL_PATH)/Graphics 

LOCAL_PATH := $(MY_LOCAL_PATH)/Platform 

include $(CLEAR_VARS) 

LOCAL_MODULE := Platform 
LOCAL_SRC_FILES := <Platform src files> 
LOCAL_CFLAGS := $(MY_LOCAL_CFLAGS) 
LOCAL_C_INCLUDES := $(MY_LOCAL_C_INCLUDES) 

include $(BUILD_STATIC_LIBRARY) 

MY_LOCAL_STATIC_LIBRARIES += Platform 

MY_LOCAL_C_INCLUDES += $(MY_LOCAL_PATH)/Platform 

LOCAL_PATH := $(MY_LOCAL_PATH) 

include $(CLEAR_VARS) 

LOCAL_MODULE := Final 
LOCAL_SRC_FILES := <Final src files> 
LOCAL_STATIC_LIBRARIES := $(MY_LOCAL_STATIC_LIBRARIES) 
LOCAL_LDLIBS := -llog 
LOCAL_CFLAGS := $(MY_LOCAL_CFLAGS) 
LOCAL_C_INCLUDES := $(MY_LOCAL_C_INCLUDES) 

include $(BUILD_SHARED_LIBRARY) 

última línea de ndk-build V=1 -B:

SharedLibrary : libFinal.so 
/Users/robbie/Library/Frameworks/Android-NDK/toolchains/arm-linux-androideabi-4.4.3/prebuilt/darwin-x86/bin/arm-linux-androideabi-g++ -Wl,-soname,libFinal.so -shared --sysroot=/Users/robbie/Library/Frameworks/Android-NDK/platforms/android-4/arch-arm <object files> /Users/robbie/Documents/Apps/Revolution/Android/obj/local/armeabi/libBase.a /Users/robbie/Documents/Apps/Revolution/Android/obj/local/armeabi/libFramework.a /Users/robbie/Documents/Apps/Revolution/Android/obj/local/armeabi/libGraphics.a /Users/robbie/Documents/Apps/Revolution/Android/obj/local/armeabi/libPlatform.a /Users/robbie/Documents/Apps/Revolution/Android/obj/local/armeabi/libstdc++.a /Users/robbie/Library/Frameworks/Android-NDK/platforms/android-4/arch-arm/usr/lib/libc.so /Users/robbie/Library/Frameworks/Android-NDK/platforms/android-4/arch-arm/usr/lib/libstdc++.so /Users/robbie/Library/Frameworks/Android-NDK/platforms/android-4/arch-arm/usr/lib/libm.so -Wl,--no-undefined -Wl,-z,noexecstack -L/Users/robbie/Library/Frameworks/Android-NDK/platforms/android-4/arch-arm/usr/lib -llog -lGLESv1_CM -lstdc++ -Wl,-rpath-link=/Users/robbie/Library/Frameworks/Android-NDK/platforms/android-4/arch-arm/usr/lib -lsupc++ -o /Users/robbie/Documents/Apps/Revolution/Android/obj/local/armeabi/libFinal.so 
/Users/robbie/Documents/Apps/Revolution/Android/obj/local/armeabi/libPlatform.a(ATexture.o): In function `ATexture': 
/Users/robbie/Documents/Apps/Revolution/Android/jni/SpinTap/ATexture.cpp:9: undefined reference to `TextureRenderer::TextureRenderer(unsigned int)' 
/Users/robbie/Documents/Apps/Revolution/Android/jni/SpinTap/ATexture.cpp:9: undefined reference to `TextureRenderer::TextureRenderer(unsigned int)' 

Edit2: TextureRenderer es en Gráficos, que está incluido.

¿Alguien tiene una idea de por qué no funciona y cómo solucionarlo?

+0

¿Hay alguna ventaja de una biblioteca compartida sobre muchas, además de tener que escribir más System.loadLibrary()? – NebulaFox

+0

No tuve su problema, simplemente no sabía cómo generar la biblioteca estática para vincular. Gracias por el ejemplo. –

Respuesta

12

Esto me parece un problema de orden de enlace.

Su línea de comandos es:

arm-linux-androideabi-g++ -Wl,-soname,libFinal.so -shared \ 
    libBase.a libFramework.a libGraphics.a libPlatform.a -o libFinal.so 

y el error es

libPlatform.a(ATexture.o): In function `ATexture': 
ATexture.cpp:9: undefined reference to `TextureRenderer' 
ATexture.cpp:9: undefined reference to `TextureRenderer' 

TextureRenderer está en Gráficos. Pero libGraphics está antes de libPlatform en la línea de comando. g ++ buscará cada biblioteca en la línea de comando en el orden en que se les da, cargando funciones para resolver referencias externas. Leerá libGraphics una vez, cargará las funciones que resuelven las referencias externas y pasará a libPlatform.

Intente cambiar LOCAL_STATIC_LIBRARIES := $(MY_LOCAL_STATIC_LIBRARIES) por LOCAL_STATIC_LIBRARIES := Platform Graphics Framework Base y vea cómo avanza.

2

En su Android.mk, asegúrese de que está haciendo referencia a la biblioteca estática con la llamada correcta:

LOCAL_STATIC_LIBRARIES := mystaticlibproj 

antes de llamar incluye $(BUILD_SHARED_LIBRARY).

Luego, al final del archivo, realizar la llamada a importar el módulo lib estática

$(call import-module, mystaticlibproj) 

Si todavía tiene problemas, publicar el registro detallado de construcción (ndk-build V=1 -B) y su Android.mk

+0

Debería mencionar que compilo todas las bibliotecas en una Android.mk – NebulaFox

+0

Primero, verificaría que TextureRenderer está en libGraphics.a, aunque probablemente sí lo esté. Utilice /Users/robbie/Library/Frameworks/Android-NDK/toolchains/arm-linux-androideabi-4.4.3/prebuilt/darwin-x86/bin/arm-linux-androideabi-nm para volcar los símbolos en la biblioteca – levis501

Cuestiones relacionadas