Ich habe nativen Quellcode in C geschrieben, den ich auf meinem Android-Gerät (Nexus 7) ausführen möchte. 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 verwende, 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. Immer wenn ich ein ndk-Build auf dem Projekt mache, bekomme ich:
%Vor%Als Lösung dachte ich daran, die Standard-Math-Bibliothek (libm.a) von arm-linux-gnueabi zu bekommen und sie mit meiner nativen Quelle zu verknüpfen. Hier ist mein Android.mk:
%Vor%Ich musste die libc von arm-linux-gnueabi-gcc verlinken und libm benötigt sie. Das Modul "ComplexOperations" wurde statisch mit arm-linux-gnueabi-gcc mit Compiler-Flags -march = armv7-a kompiliert. Diese Bibliothek nutzt complex.h. Dies baut ohne Fehler und Warnungen auf. Aber wenn ich die Anwendung starte und
anrufe %Vor%Ich erhalte diesen Fehler bei logcat:
%Vor%Bei diesem Fehler wird eine UnsatisfiedLinkError-Ausnahme ausgelöst, die dazu führt, dass die Anwendung abstürzt, wenn sie nicht behandelt wird.
Kann jemand PLEASEE helfen mir aus !! Ich habe das schon seit Tagen selbst versucht! : (
Gelöst!
Zunächst sollte ich meine ComplexOperations-Quellen mit der vom Android-NDK bereitgestellten Toolchain erstellt haben, da die Dokumentation eindeutig besagt, dass keine Kompilierung mit Gnu-Compilern erfolgen soll. Das war mein erster Fehler. Das allein hat mein Problem noch nicht gelöst, da ich den Komplex noch nicht gefunden habe. Ich habe keinen Fehler gefunden, wenn ich einen ndk-build mache. Das Android NDK enthält eine sehr begrenzte Implementierung der Standard-libc. Um dies zu lösen, habe ich CrystaX NDK verwendet, eine erweiterte Implementierung von Android NDK. Das hat alles gelöst !!
Ab Android-L (ollipop) bietet das NDK jetzt den Header complex.h an.
Laden Sie die neueste NDK-Revision von Ссылка herunter, und complex.h finden Sie in /platforms/android-L/arch-arm/usr/include
.
Ich habe die folgende Zeile zu Android.mk
hinzugefügt, was das Problem anscheinend behoben hat.
Ich bin mir nicht sicher, welche Variable den C:\Users\Sami\workspace\
-Teil ersetzen würde, also wenn jemand Bescheid weiß, bitte sag es.
Bearbeiten:
Eigentlich hat das nur aus irgendeinem Grund den Fehler entfernt, aber es hat das Problem nicht von dem entfernt, was ich bemerkt habe. In diesem Zusammenhang könnte C:\Users\Sami\workspace\android-ndk-r8e
durch $(NDK_ROOT)
ersetzt werden.
Ich habe den NDK von Crystax ausprobiert, aber ich habe immer den Fehler complex.h
nicht gefunden gefunden. 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.
Es scheint, als ob dein PATH gebrochen ist. Bitte beachten Sie die folgenden Posts, um dieses Problem zu lösen.
Tags und Links android-ndk cross-compiling glibc loadlibrary libm