2016-05-05 11 views
0

Ich versuche, eine gemeinsame Bibliothek von FFTW mittels folgendem Skript zu bauen:Gebäude geteilt FFTW Bibliothek für Android

INSTALL_DIR="`pwd`/jni/fftw3" 
SRC_DIR="`pwd`/../fftw-3.3.4" 

cd $SRC_DIR 

NDK_ROOT=/path_to_android/Sdk/ndk-bundle 

export PATH="$NDK_ROOT/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/:$PATH" 
export SYS_ROOT="$NDK_ROOT/platforms/android-21/arch-arm/" 
export CC="arm-linux-androideabi-gcc --sysroot=$SYS_ROOT" 
export LD="arm-linux-androideabi-ld" 
export AR="arm-linux-androideabi-ar" 
export RANLIB="arm-linux-androideabi-ranlib" 
export STRIP="arm-linux-androideabi-strip" 

mkdir -p $INSTALL_DIR 
./configure --enable-shared --host=arm-eabi --build=i386-linux --prefix=$INSTALL_DIR LIBS="-lc -lgcc" --enable-float 

make 
make install 

exit 0 

jedoch nach der Ausführung des Skripts habe ich immer nur eine statische FFTW Bibliothek erhalten, obwohl ich verwende den enable-shared Parameter. Gibt es eine andere Möglichkeit zum Generieren der freigegebenen Bibliotheksdatei?
Ich brauche wirklich eine gemeinsam genutzte Bibliothek, da Android Studio eine gemeinsame Bibliothek benötigt, um zusätzliche JNI-Quellen zu kompilieren.

Update:
Basierend auf @ bullsy Antwort, ich könnte die gemeinsame Bibliothek erstellen, indem Sie die Host-Parameter auf --host=arm-linux-androideabi chaning. Das resultierende Problem ist, dass FFTW eine versionierte freigegebene Bibliothek mit den Bibliotheksdateien libfftw.so.3 und libfftw.so.3.4.4 generiert. Ich habe eine tutorial gefunden, die zeigt, wie diese Dateien in .so Dateien konvertiert werden. Während auf libfftw3.so oder libfftw3.so.3 arbeiten, erhielt ich immer den Fehler, dass Datei nicht (regular) ist Datei so habe ich versucht, alles auf libfftw3.so.3.4.4:

rpl -R -e libfftw3.so.3 libfftw3_3.so libfftw3.so.3.4.4 
mv libfftw3.so.3.4.4 libfftw3_344.so 
ln -sfn libfftw3_344.so libfftw3.so.3 
mv libfftw3.so.3 libfftw3_3.so 

Ich hatte manuell den ln Befehl hinzuzufügen. Ohne den Symlink zu ändern, konnte Gradle libfftw3_3.so während des Aufbaus der Apk nicht finden.
So läuft meine Anwendung jetzt mit den gemeinsamen Bibliotheken, aber es ist auch möglich, gemeinsame FFTW-Bibliotheken mit einfacher Genauigkeit zu erzeugen (-enable-float)?


Ein weiterer Ansatz war die statische Bibliothek-Datei zu übernehmen und eine gemeinsam genutzte Bibliotheksdatei mit Hilfe eines Android.mk und NDK-build zu bauen:

LOCAL_PATH := $(call my-dir) 

include $(CLEAR_VARS) 

LOCAL_MODULE := fftw3 
LOCAL_SRC_FILES := fftw3/lib/libfftw3.a 
include $(PREBUILT_STATIC_LIBRARY) 

LOCAL_MODULE := fftw_wrapper 
LOCAL_C_INCLUDES := /path_to_fftw_headers/include 
LOCAL_C_INCLUDES += /pat_to_wrapper/fftw_wrapper.h 
LOCAL_SRC_FILES := fftw_wrapper.cpp 
LOCAL_SHARED_LIBRARIES := fftw3f 
include $(BUILD_SHARED_LIBRARY) 

Aber dieser Ansatz immer wieder undefined reference Fehler, z undefinierter Verweis auf "fftw_malloc". Ich habe versucht, es auch ohne die --build Parameter, wie es in dieser Frage erklärt: Using FFTW on Android undefined references

Jedes Mal, wenn ich die statische Bibliothek verwenden, meine Anwendung läuft gut, auch wenn ich statisch die fftw_wrapper im verlinken Android.mk. Da meine C/C++ - Importe jedoch alle in der App Gradle-Datei von Android Studio definiert sind, möchte ich nicht zu Android.mk-Dateien zurückkehren. Gibt es eine andere Lösung?

Antwort

1

Versuchen Sie es mit

--host=arm-linux-androideabi 

statt. Das sagt configure 'Hey, ich baue für eine Linux-Variante', die Shared Libraries zur Standardauswahl macht.

+0

Vielen Dank! Mit diesem Parameter kann ich die shared library erfolgreich erstellen, aber ich muss den Parameter _-- enable-float_ löschen. Allerdings, wenn ich die Bibliothek in meiner Anwendung lade. Ich bekomme einen 'UnbefriedigendLinkError: dlopen fehlgeschlagen: libfftw3.so.3 nicht gefunden'. Kann ich FFTW mitteilen, dass nur eine Datei erstellt werden soll oder wie kann ich diese zusätzliche Datei laden? Wenn ich float aktiviere, bekomme ich viele undefinierte Referenzen auf 'fftwf_codelet_XX' Dateien wie' fftwf_codelet_n1_2' oder 'fftwf_codelet_hc2cb_2'. Ist es auch möglich Float für die gemeinsame FFTW-Bibliothek für Android zu aktivieren? – budderick