2016-05-05 2 views
0

Je suis en train de construire une bibliothèque partagée de FFTW au moyen du script suivant:Mitoyen bibliothèque FFTW pour 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 

Cependant, après l'exécution du script que je toujours que recevoir une bibliothèque FFTW statique, même si je utilise le paramètre enable-shared. Existe-t-il un autre moyen de générer le fichier de bibliothèque partagée?
J'ai vraiment besoin d'une bibliothèque partagée car Android Studio exige une bibliothèque partagée pour compiler des sources JNI supplémentaires.

Mise à jour:
Sur la base de la réponse de @ bullsy, je pourrais construire la bibliothèque partagée par chaning le paramètre hôte à --host=arm-linux-androideabi. Le problème qui en résulte est que FFTW génère une bibliothèque partagée versionnée avec les fichiers de bibliothèque libfftw.so.3 et libfftw.so.3.4.4. J'ai trouvé un tutorial qui montre comment convertir ces fichiers .so fichiers. Tout en travaillant sur libfftw3.so ou libfftw3.so.3, j'ai toujours reçu l'erreur fichier n'est pas un (régulier) fichier donc je tout essayé sur 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 

je devais ajouter manuellement la commande ln. Sans modifier le lien symbolique, Gradle n'a pas pu trouver libfftw3_3.so pendant le processus de construction de l'apk.
Donc, mon application fonctionne maintenant avec les bibliothèques partagées mais il est également possible de générer des bibliothèques FFTW partagées avec une seule précision (-enable-float)?


Une autre approche a été de prendre le fichier de bibliothèque statique et pour créer un fichier de bibliothèque partagée au moyen d'un Android.mk et NDK-build:

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) 

Mais cette approche revient toujours référence non définie erreurs, par exemple référence indéfinie à 'fftw_malloc'. J'ai aussi essayé sans --build paramètre comme il est expliqué dans cette question: Using FFTW on Android undefined references

Chaque fois que j'utilise la bibliothèque statique, mon application fonctionne très bien, même si je lie statiquement le fftw_wrapper dans le Android.mk. Toutefois, comme mes importations C/C++ sont toutes définies dans le fichier Gradle de l'application Android Studio, je ne souhaite pas revenir aux fichiers Android.mk. N 'y a-t-il pas une autre solution?

Répondre

1

Essayez d'utiliser

--host=arm-linux-androideabi 

à la place. Cela indique à configure 'Hey, je construis pour une variante linux', ce qui fait des bibliothèques partagées le choix par défaut.

+0

Merci beaucoup! Avec ce paramètre je peux créer avec succès la bibliothèque partagée mais je dois supprimer le paramètre _-- enable-float_. Cependant, si je charge la bibliothèque dans mon application. Je reçois un 'UnsatisfiedLinkError: dlopen échoué: libfftw3.so.3 non trouvé'. Puis-je demander à FFTW de créer un seul fichier ou comment puis-je charger ce fichier supplémentaire? Si j'active float, j'obtiens beaucoup de références non définies aux fichiers 'fftwf_codelet_XX' comme' fftwf_codelet_n1_2' ou 'fftwf_codelet_hc2cb_2'. Est-il également possible d'activer float pour la bibliothèque FFTW partagée pour Android? – budderick