2011-05-25 17 views
8

Estoy tratando de compilar la biblioteca nvfile de http://developer.nvidia.com/tegra-resources, en la carpeta ndk de android, libs. De todos modos, como realmente no necesito todo el conjunto de bibliotecas, saqué el que necesitaba, con lo que parecían ser sus dependencias. Aquí está el archivo Android.mk para compilarlos.Vinculación de bibliotecas estáticas en android ndk

include $(CLEAR_VARS) 
LOCAL_MODULE  := nvthread 
LOCAL_CFLAGS  := -Wall -g 
LOCAL_LDFLAGS := -Wl,-Map,xxx.map 
LOCAL_SRC_FILES := nv/nv_thread/nv_thread.c 
LOCAL_C_INCLUDES := nv 

include $(BUILD_STATIC_LIBRARY) 


include $(CLEAR_VARS) 
LOCAL_MODULE   := nvfile 
LOCAL_CFLAGS   := -Wall -g 
LOCAL_LDFLAGS   := -Wl,-Map,xxx.map 
LOCAL_SRC_FILES  := nv/nv_file/nv_file.c 
LOCAL_C_INCLUDES  := nv 
LOCAL_STATIC_LIBRARIES := nvthread nvapkfile 

include $(BUILD_STATIC_LIBRARY) 


include $(CLEAR_VARS) 
LOCAL_MODULE   := nvapkfile 
LOCAL_CFLAGS   := -Wall -g 
LOCAL_LDFLAGS   := -Wl,-Map,xxx.map 
LOCAL_SRC_FILES  := nv/nv_apk_file/nv_apk_file.c 
LOCAL_C_INCLUDES  := nv 
LOCAL_STATIC_LIBRARIES := nvthread 

include $(BUILD_STATIC_LIBRARY) 

La biblioteca nvapkfile parece ser capaz de enlazar bien con nvthread, pero no parece la biblioteca nvfile a querer vincular a la biblioteca nvapkfile en absoluto. Los archivos de inclusión en el código fuente funcionan correctamente, es solo que cada vez que intento compilarlo, obtengo una referencia indefinida. Aquí hay una muestra de salida:

/home/leif/MarbleMachine/android/obj/local/armeabi/libnvfile.a(nv_file.o): In function `NvFInit': 
/home/leif/MarbleMachine/android/jni/nv/nv_file/nv_file.c:49: undefined reference to `NvAPKInit' 
/home/leif/MarbleMachine/android/obj/local/armeabi/libnvfile.a(nv_file.o): In function `NvFOpen': 
/home/leif/MarbleMachine/android/jni/nv/nv_file/nv_file.c:77: undefined reference to `NvAPKOpen' 
/home/leif/MarbleMachine/android/jni/nv/nv_file/nv_file.c:82: undefined reference to `NvAPKOpen' 
/home/leif/MarbleMachine/android/obj/local/armeabi/libnvfile.a(nv_file.o): In function `NvFClose': 
/home/leif/MarbleMachine/android/jni/nv/nv_file/nv_file.c:97: undefined reference to `NvAPKClose' 
/home/leif/MarbleMachine/android/obj/local/armeabi/libnvfile.a(nv_file.o): In function `NvFGetc': 
/home/leif/MarbleMachine/android/jni/nv/nv_file/nv_file.c:118: undefined reference to `NvAPKGetc' 
/home/leif/MarbleMachine/android/obj/local/armeabi/libnvfile.a(nv_file.o): In function `NvFGets': 
/home/leif/MarbleMachine/android/jni/nv/nv_file/nv_file.c:133: undefined reference to `NvAPKGets' 
/home/leif/MarbleMachine/android/obj/local/armeabi/libnvfile.a(nv_file.o): In function `NvFSize': 
/home/leif/MarbleMachine/android/jni/nv/nv_file/nv_file.c:148: undefined reference to `NvAPKSize' 
/home/leif/MarbleMachine/android/obj/local/armeabi/libnvfile.a(nv_file.o): In function `NvFSeek': 
/home/leif/MarbleMachine/android/jni/nv/nv_file/nv_file.c:171: undefined reference to `NvAPKSeek' 
/home/leif/MarbleMachine/android/obj/local/armeabi/libnvfile.a(nv_file.o): In function `NvFTell': 
/home/leif/MarbleMachine/android/jni/nv/nv_file/nv_file.c:186: undefined reference to `NvAPKTell' 
/home/leif/MarbleMachine/android/obj/local/armeabi/libnvfile.a(nv_file.o): In function `NvFRead': 
/home/leif/MarbleMachine/android/jni/nv/nv_file/nv_file.c:201: undefined reference to `NvAPKRead' 
/home/leif/MarbleMachine/android/obj/local/armeabi/libnvfile.a(nv_file.o): In function `NvFEOF': 
/home/leif/MarbleMachine/android/jni/nv/nv_file/nv_file.c:216: undefined reference to `NvAPKEOF' 

No he modificado los archivos reales c o h en absoluto. Pero para referencia, es aquí una pieza del archivo C relativo en la pregunta: ¿

#include "nv_file.h" 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

#ifdef ANDROID 
#include "../nv_apk_file/nv_apk_file.h" 
#define SUPPORT_APK 1 
#include <unistd.h> 
#endif 

//... 

void NvFInit() 
{ 
#ifdef SUPPORT_APK 
    NvAPKInit(); 
#endif 
} 

Ésta es líneas 22-32 y 46-51 de nv_file.c

Como se puede ver, la cabecera está recibiendo incluido, pero no está vinculando. ¿Alguien tiene alguna idea de lo que me falta aquí? Gracias.

Respuesta

4

Ugg .. parece que lo tengo en el orden incorrecto. Pasando esta línea (en el módulo nvfile):

LOCAL_STATIC_LIBRARIES := nvthread nvapkfile 

a

LOCAL_STATIC_LIBRARIES := nvapkfile nvthread 

lo hizo compilar bien. ¿Alguien puede confirmar que el orden en que enumera las bibliotecas en LOCAL_STATIC_LIBRARIES puede ser importante? Gracias.

+2

Creo que acaba de confirmar que puede ser importante. Si debe ser importante es otra cosa (para la que no tengo respuesta) – cidermonkey

+1

Este mensaje confirma que el orden es importante (y por qué) https://groups.google.com/d/msg/android-ndk/ az5uLxh04OI/xb5WWzD88msJ – Kekoa

+1

Lamentablemente, habiéndolo descubierto de la manera más difícil, también puedo confirmar que el orden es importante, aunque tuve que jugar con él para que funcione. Consulte también https://code.google.com/p/android/issues/detail?id=39378 para obtener más información relacionada, y aquí: http://osdir.com/ml/android-ndk/2010-10/ msg00018.html – Mick

Cuestiones relacionadas