2011-09-09 10 views
5

Estoy trabajando con Android NDK r6b en cygwin (el sistema se ha actualizado correctamente). Estoy modificando la muestra de hello-jni para aprender a trabajar con NDK. Como tengo una biblioteca escrita en C++ que deseo usar en el hello-jni (de hecho, he creado un prj llamado helloworld con un solo archivo .cpp llamado ndkfoo.cpp) ejemplo, creé un nuevo proyecto de Android en Eclipse (actualizado para Android), agregó un directorio jni, agregó un Android.mk y archivos Application.mk, los editó para compilar el .cpp. Al final de la compilación, obtengo un archivo .so.Android NDK - problema que une una biblioteca externa (no puede encontrarlo)

Ahora, en el helloWorld Android.mk, necesito hacer algunos cambios para decirle al enlazador que incluya esa biblioteca. Supongamos que el archivo de la biblioteca es libmylib.so, tengo el siguiente script android.mk:

LOCAL_PATH: = $ (llamar a mi-dir)

incluyen $ (CLEAR_VARS)

LOCAL_MODULE: = ndkfoo

LOCAL_SRC_FILES: = ndkfoo.cpp

LOCAL_C_INCLUDES + = $ (LOCAL_PATH)/mibiblioteca

LOCAL_LDLIBS + = -L $ (LOCAL_PATH) /../../ mibiblioteca/libs/armeabi/-lmylib

incluyen $ (BUILD_SHARED_LIBRARY)

Mis directorios se organizan de la siguiente manera:

d:/android/android-ndk-r6b => android ndk root 
d:/android/workspace/helloworld => helloworld project 
d:/android/workspace/mylib => mylib project library 

(por lo tanto, la ruta a libmylib.so es: d:/android/workspace/mylib/libs/armeabi).

Desafortunadamente, esto no parece funcionar. Si elimino toda referencia a mylib de ndkfoo.cpp, compila y ejecuta incluso en mi teléfono. Si no quito referencias a mibiblioteca, compila pero doens't enlace: i obtener el siguiente resultado:

D: /android/android-ndk-r6b/toolchains/arm-linux-androideabi-4.4. 3/preconstruido/windo ws/bin /../ lib/gcc/arm-linux-androideabi/4.4.3 /../../../../ arm-linux-androideabi/ bin/ld. exe: no se puede encontrar -lmylib

Ps. Olvidé mencionar que ejecuto ndk-buld bajo el directorio jni del proyecto helloworld. Pss. He encontrado muchas preguntas similares en internet. Siempre he trabajado con Visual C C IDE/++, así que estoy realmente nuevo a GCC, archivos make y así sucesivamente ...

+1

Bien, descubrió cómo solucionar este problema. Por alguna extraña razón que no entiendo, la ruta especificada como -L/cygdrive/d/android/workspace/mylib/libs/armeabi no funciona (y esta es la razón por la cual el uso de LOCAL_PATH resulta en un error). En cambio, usar -Ld:/android/workspace/mylib/libs/armeabi o -L ../../ mylib/libs/armeabi funciona. Supongo que cygwin es el problema aquí ... – Luke

+0

publique su comentario como respuesta si resuelve su problema –

Respuesta

1

El mensaje

D:/Android/android-NDK-R6b/cadenas de herramientas /arm-linux-androideabi-4.4.3/prebuilt/windo ws/bin /../ lib/gcc/arm-linux-androideabi/4.4.3 /../../../../ arm-linux -androideabi/bin/ld.exe: no puede encontrar -lmylib

usted está indicando que el enlazador no es encontrar su biblioteca, esto debe venir de un problema en la ruta de la LD_LIBS'.

Creo que my-dir macro no incluye el identificador de unidad de los dispositivos, por lo tanto, su variable LOCAL_PATH debería perder la D: y, creo, no funcionará con cygwin. Soy usuario de Linux y no estoy 100% seguro, pero, si sustituye

LOCAL_PATH := $(call my-dir) 

por

LOCAL_PATH := D:$(call my-dir) 

que debería funcionar. Por otro lado, siempre puede establecer la ruta relativa estableciendo:

LOCAL_LDLIBS += -L$../../mylib/libs/armeabi/ -lmylib 
Cuestiones relacionadas