Связывание статических библиотек в Android ndk - PullRequest
8 голосов
/ 25 мая 2011

Я пытаюсь скомпилировать библиотеку nvfile из http://developer.nvidia.com/tegra-resources, в примере Android ndk, папка libs.В любом случае, поскольку мне не нужен весь набор библиотек, я вытащил ту, которая мне была нужна, с тем, что казалось ее зависимостями.Вот файл Android.mk для их компиляции.

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)

Кажется, что библиотека nvapkfile может нормально связываться с nvthread, но библиотека nvfile, похоже, не хочет связываться с библиотекой nvapkfileсовсем.Включаемые файлы в исходном коде работают правильно, просто всякий раз, когда я пытаюсь его скомпилировать, я получаю неопределенную ссылку.Вот пример выходных данных:

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

Я не модифицировал фактические файлы c или h вообще.Но для справки, здесь есть фрагмент соответствующего C-файла:

#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
}

Это строки 22-32 и 46-51 файла nv_file.c

Как видите,заголовок включается, но не связывается.У кого-нибудь есть идеи, что мне здесь не хватает?Спасибо.

1 Ответ

4 голосов
/ 25 мая 2011

Тьфу ... кажется, у меня это было не в том порядке.С помощью этой строки (в модуле nvfile):

LOCAL_STATIC_LIBRARIES := nvthread nvapkfile

до

LOCAL_STATIC_LIBRARIES := nvapkfile nvthread

все компилировалось очень хорошоКто-нибудь может подтвердить, что порядок, в котором вы перечисляете библиотеки в LOCAL_STATIC_LIBRARIES, может быть важен?Спасибо.

...