2013-03-06 6 views
8

Ich habe nativen Quellcode in C geschrieben, den ich gerne auf meinem Android-Gerät (Nexus 7) ausführen würde. Ich habe bereits viele Forschung und Online-Tutorials zum Ausführen von nativem Code auf Android mit Android NDK erfolgreich durchgeführt. Ich habe einiges darüber gelernt. Der Code, den ich habe, nutzt jedoch die komplexen Funktionalitäten der Standard-Math-Bibliothek, die in complex.h definiert ist. Die NDK C-Bibliothek scheint jedoch die komplexen Funktionalitäten nicht zu unterstützen. Jedes Mal, wenn ich ein NDK-build auf dem Projekt bekomme ich:Wie kann ich complex.h für Android NDK verwenden?

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

Als Lösung Ich dachte an die Standard-Mathematik-Bibliothek bekommen (libm.a) von Arm-linux-gnueabi und verknüpfen es mit meiner natürlichen Quelle. Hier ist meine 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) 

ich die libc des Arms-linux-gnueabi-gcc zu verbinden hatte sowie libm es braucht. Das Modul "ComplexOperations" wurde statisch mit arm-linux-gnueabi-gcc mit Compiler-Flags -march = armv7-a kompiliert. Diese Bibliothek nutzt complex.h. Dies wird ohne Fehler und Warnungen erstellt. Aber wenn ich die Anwendung und rufe

System.loadLibrary("MySource"); 

ich diesen Fehler auf 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"... 

Auf diesem Fehler eine UnsatisfiedLinkError Ausnahme ausgelöst wird, die die Anwendung zum Absturz bringt, wenn nicht behandelt.

Kann jemand PLEASEE helfen mir aus !! Ich habe das schon seit Tagen selbst versucht! :(

+1

Android ernsthaft hat keine 'complex.h'? –

Antwort

0

GELÖST!

Zunächst einmal sollte ich‘ Ich habe meine ComplexOperations-Quellen mit der vom Android-NDK bereitgestellten Toolchain erstellt, da die Dokumentation eindeutig besagt, dass keine Kompilierung mit Gnu-Compilern erfolgen soll bei alleine löste sich mein Problem noch nicht, da ich noch den Komplex bekam.h habe keinen Fehler gefunden, wenn ich einen ndk-build mache. Das Android NDK enthält eine sehr begrenzte Implementierung der Standard-libc. Um das zu lösen, habe ich CrystaX NDK, eine erweiterte Implementierung von Android NDK. Das hat alles gelöst !!

+0

Wie hast du es geschafft, das Problem zu lösen? Du hast gerade den Cross-Compiler von CrystaX benutzt? – JohnTortugo

+0

Es ist schon eine Weile her, aber wenn ich mir meine Antwort oben anschaue, habe ich die Toolchain von Android NDK benutzt, um Cross-Compiling durchzuführen und das Ndk-Build-Tool von CrystaX zu verwenden. Vielleicht unterstützt das ndk-build-Tool von Android NDK jetzt die complex.h-Bibliothek. Aber wenn nicht, wird CrystaX es tun. Viel Glück! – Sam

+0

Scheint, dass nur die g ++ die complex.h Datei hat. Ich denke auch über die CrystaX Cross-Compiler nach. Jedenfalls. – JohnTortugo

0

Es scheint, wie PATH ist gebrochen. Bitte beziehen Beiträge zu folgenden dieses Problem zu lösen.

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

android ndk error "no such file or directory"?

+0

Danke Yasir. Aber mein PATH ist nicht kaputt, da der Compiler alle anderen Header finden kann. Es ist nur so, dass der Compiler, den NDK verwendet, keine komplexen Operationen unterstützt, die in der Math-Bibliothek definiert sein sollten. Ich denke, dass ich dieses Problem bereits gelöst habe, indem ich die bionische Math-Lib mit meiner Quelle verlinkt habe, aber jetzt stieß ich auf das Linking-Error-Problem! Ich habe einen Objdump in den Bibliotheken gemacht und gelernt, dass .LANCHOR2 in libc.a definiert ist, mit der ich meine Quelle verlinkt habe (siehe meine Android.mk). Ich denke, ich sollte jetzt einen Weg finden, diese libc auf Android zu laden – Sam

1

Ich fügte Android.mk die folgende Zeile hinzu, die das Problem zu beheben scheint.

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

nicht sicher, welche Variable den C:\Users\Sami\workspace\ Teil ersetzen würde, also wenn jemand weiß, bitte sagen.


Edit: Eigentlich, das nur den Fehler aus irgendeinem Grund entfernt, aber es hat nicht das Problem zu beheben, was ich bemerkt. In diesem Zusammenhang könnte C:\Users\Sami\workspace\android-ndk-r8e durch $(NDK_ROOT) ersetzt werden.

Ich versuchte Crystax NDK, aber ich bekam immer die complex.h nicht gefunden Fehler. Ich habe lediglich complex.h und _mingw.h in mein jni-Verzeichnis kopiert. Alles hat funktioniert und der Code wurde sowohl auf dem x86- als auch auf dem ARM-Emulator getestet.