2013-03-06 13 views
8

Ho un codice sorgente nativo scritto in C che vorrei eseguire sul mio dispositivo Android (Nexus 7). Ho già effettuato con successo molte ricerche e tutorial online sull'esecuzione di codice nativo su Android utilizzando Android NDK. Ho acquisito una certa conoscenza su questo. Tuttavia, il codice che ho utilizza le funzionalità complesse della libreria matematica standard, definite in complex.h. La libreria C NDK tuttavia non sembra supportare le funzionalità complesse. Ogni volta che faccio un NDK-build sul progetto ottengo:Come posso utilizzare complex.h per Android NDK?

fatal error: complex.h: no such file or directory. 

Come soluzione ho pensato di ottenere la libreria matematica standard (libm.a) dal braccio-linux-gnueabi e collegarlo con la mia fonte d'origine. Qui è la mia Android.mk:

LOCAL_PATH := $(call my-dir) 

include $(CLEAR_VARS) 
LOCAL_MODULE := StandardC 
LOCAL_SRC_FILES := libc.a 
include $(PREBUILT_STATIC_LIBRARY) 

include $(CLEAR_VARS) 
LOCAL_MODULE := mathLib 
LOCAL_SRC_FILES := libm.a 
LOCAL_STATIC_LIBRARIES := StandardC 
include $(PREBUILT_STATIC_LIBRARY) 

include $(CLEAR_VARS) 
LOCAL_MODULE := ComplexOperations 
LOCAL_SRC_FILES := libComplexOperations.a 
LOCAL_STATIC_LIBRARIES := mathLib 
LOCAL_C_INCLUDES += /usr/arm-linux-gnueabi/include 
include $(PREBUILT_STATIC_LIBRARY) 

include $(CLEAR_VARS) 
LOCAL_MODULE := MySource 
LOCAL_CFLAGS += -std=c99 
LOCAL_SRC_FILES := com_samuel_test_ComplexOperationsLib.c 
LOCAL_C_INCLUDES += /usr/arm-linux-gnueabi/include 
LOCAL_STATIC_LIBRARIES := ComplexOperations 
include $(BUILD_SHARED_LIBRARY) 

ho dovuto collegare la libc del braccio-linux-gnueabi-gcc nonché libm ne ha bisogno. Il modulo "ComplexOperations" è stato compilato staticamente usando arm-linux-gnueabi-gcc con i flag del compilatore -march = armv7-a. Questa libreria utilizza complex.h. Questo genera senza errori e avvisi. Ma quando faccio funzionare l'applicazione e chiamo

System.loadLibrary("MySource"); 

ottengo questo errore su logcat:

E/dalvikvm(3932): dlopen("/data/app-lib/com.samuel.test-1/libMySource.so") failed: Cannot load library: soinfo_relocate(linker.cpp:975): cannot locate symbol ".LANCHOR2" referenced by "libMySource.so"... 

Su questo errore viene generata un'eccezione UnsatisfiedLinkError che causa il blocco dell'applicazione, se non gestita.

Qualcuno può PER FAVORE aiutarmi !! Ho già provato a capirlo da giorni !! :(

+1

Android non ha seriamente un 'complex.h'? –

risposta

0

risolto!

Prima di tutto dovrebbe' Ho costruito le mie sorgenti di ComplexOperations con la toolchain fornita da Android NDK, in quanto la documentazione afferma chiaramente di non eseguire cross-compilare con i compilatori gnu. Quindi questo è stato il mio primo errore Th da solo non ha ancora risolto il mio problema perché ho ancora l'errore complex.h non trovato quando eseguo un ndk-build. L'NDK di Android contiene un'implementazione MOLTO limitata della libc Standard. Per risolvere questo ho usato CrystaX NDK, un'implementazione estesa di Android NDK. Questo ha risolto tutto !!

+0

Come sei riuscito a risolvere il problema? Hai appena usato il cross-compiler di CrystaX? – JohnTortugo

+0

È passato un po 'di tempo, ma se guardo la mia risposta sopra, ho usato la toolchain di Android NDK per compilare e compilare lo strumento Ndk-build di CrystaX. Forse lo strumento ndk-build di Android NDK supporta ora la libreria complex.h. Ma se no, lo farà CrystaX. In bocca al lupo! – Sam

+0

Sembra che solo il g ++ abbia il file complex.h. Sto anche considerando i cross-compilers CrystaX. Grazie comunque. – JohnTortugo

0

Sembra che il PATH è rotto. Si prega di fare riferimento alla seguente messaggi per risolvere questo problema.

Android NDK: how to include Android.mk into another Android.mk (hierarchical project structure)?

android ndk error "no such file or directory"?

+0

Grazie Yasir. Ma il mio PERCORSO non è rotto in quanto il compilatore può trovare tutte le altre intestazioni. È solo che il compilatore utilizzato da NDK non supporta operazioni complesse che dovrebbero essere state definite nella lib di matematica. Suppongo di aver già risolto questo problema collegando la lib di matematica bionica alla mia sorgente, ma ora mi sono imbattuto nel problema dell'errore di collegamento! Ho fatto un objdump sulle librerie e ho appreso che .LANCHOR2 è definito in libc.a con cui ho collegato la mia fonte (vedi il mio Android.mk). Credo che ora dovrei trovare un modo per caricare anche quella libc su Android – Sam

1

Ho aggiunto la seguente riga a Android.mk, che sembra aver risolto il problema.

LOCAL_C_INCLUDES += C:\Users\Sami\workspace\android-ndk-r8e\sources\cxx-stl\gnu-libstdc++\4.7\include\ 

Non sono sicuro quale variabile dovrebbe sostituire la parte C:\Users\Sami\workspace\, quindi se qualcuno sa, per favore dica.


Edit: In realtà, che solo rimosso l'errore per qualche ragione, ma non ha risolto il problema di quello che ho notato. Su tale nota, C:\Users\Sami\workspace\android-ndk-r8e potrebbe essere stato sostituito con $(NDK_ROOT).

Ho provato NDK di Crystax, ma ho continuato a ricevere l'errore complex.h non trovato. Tutto quello che ho fatto è stato semplicemente copiare complex.h e _mingw.h nella mia directory jni. Tutto ha funzionato e il codice è stato testato su entrambi gli emulatori x86 e ARM.