2011-09-09 11 views
5

Sto lavorando con Android NDK r6b sotto cygwin (il sistema è aggiornato correttamente). Sto modificando il campione ciao-jni per imparare a lavorare con NDK. Dato che ho una libreria scritta in C++ che desidero usare nell'hello-jni (in realtà, ho creato un prj chiamato helloworld con un singolo file .cpp chiamato ndkfoo.cpp), ho creato un nuovo progetto Android in Eclipse (aggiornato per Android), aggiunto una directory jni, aggiunto un file Android.mk e Application.mk, modificato per compilare il file .cpp. Alla fine della compilazione, ottengo un file .so.NDK Android - problema di collegamento di una libreria esterna (non trovata)

Ora, nel helloworld Android.mk, ho bisogno di apportare alcune modifiche per dire al linker di includere quella libreria. Supponiamo che il file di libreria è libmylib.so, ho il seguente script android.mk:

local_path: = $ (chiamare il mio-dir)

includono $ (CLEAR_VARS)

LOCAL_MODULE: = ndkfoo

LOCAL_SRC_FILES: = ndkfoo.cpp

LOCAL_C_INCLUDES + = $ (local_path)/mylib

LOCAL_LDLIBS + = -L $ (local_path) /../../ mylib/librerie/armeabi/-lmylib

includono $ (BUILD_SHARED_LIBRARY)

mie cartelle sono organizzate nel modo seguente:

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

(di conseguenza, il percorso per libmylib.so è: d:/android/workspace/mylib/libs/armeabi).

Sfortunatamente, questo non sembra funzionare. Se rimuovo ogni riferimento a mylib da ndkfoo.cpp, esso viene compilato ed eseguito anche sul mio telefono. Se io non rimuovere i riferimenti a mylib, compila ma doens't link: ottengo il seguente risultato:

D: /android/android-ndk-r6b/toolchains/arm-linux-androideabi-4.4. 3/prebuilt/windo ws/bin /../ lib/gcc/arm-linux-androideabi/4.4.3 /../../../../ arm-linux-androideabi/ bin/ld. exe: impossibile trovare -lmylib

Ps. Ho dimenticato di menzionare che eseguo ndk-buld sotto la directory jni del progetto helloworld. Pss. Ho trovato molte domande simili su Internet. Ho sempre lavorato con Visual C/C++ IDE, quindi sono davvero una novità per GCC, makefile e così via ...

+1

Ok, ha trovato come risolvere questo problema. Per qualche strana ragione che non capisco, il percorso specificato come -L/cygdrive/d/android/workspace/mylib/libs/armeabi non funziona (ed è per questo che l'utilizzo di LOCAL_PATH provoca un errore). Invece, usando -Ld:/android/workspace/mylib/libs/armeabi o -L ../../ mylib/libs/armeabi funziona. Suppongo che Cygwin sia il problema qui ... – Luke

+0

pubblica il tuo commento come risposta se risolve il tuo problema –

risposta

1

Il messaggio

D:/android/android-NDK-R6B/toolchain /arm-linux-androideabi-4.4.3/prebuilt/windo ws/bin /../ lib/gcc/arm-linux-androideabi/4.4.3 /../../../../ arm-linux -androideabi/bin/ld.exe: non riesce a trovare -lmylib

si indica che il linker non è trovare la libreria, questo dovrebbe venire da un problema nel percorso LD_LIBS'.

Penso che la macro mia-dir non includa l'identificatore di unità dei dispositivi, quindi la variabile LOCAL_PATH dovrebbe perdere la D: e, penso, non funzionerà con cygwin. Sono un utente Linux e non sono sicuro al 100%, ma, se si sostituisce

LOCAL_PATH := $(call my-dir) 

da

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

dovrebbe funzionare. D'altra parte è sempre possibile impostare il percorso relativo impostando:

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