El sistema de compilación FFTW3 hace uso de Autotools, por lo que no puede usarlo directamente con el NDK de Android. Una buena publicación de blog que trata este problema es here.
La idea es generar un archivo config.h
adecuado fuera de línea y crear archivos Makefiles de Android, que reemplazan los desaparecidos normalmente generados por las Autotools.
Para lograr un diseño modular para los diferentes módulos nativos que podría utilizar, te recomiendo los siguientes:
En su directorio superior jni/
poner estos dos archivos:
Application.mk
:
APP_OPTIM := release
APP_ABI := armeabi armeabi-v7a
APP_MODULES := fftw3
Android.mk
:
TOP_DIR := $(call my-dir)
include $(TOP_DIR)/fftw3/project/jni/Android.mk
De esta forma puede agregar fácilmente un nuevo módulo creando un directorio jni/new_module_name
y luego agregando new_module_name
a la lista APP_MODULES
.
A continuación, cree un nuevo directorio jni/fftw3
y poner otra Application.mk
allí:
Application.mk
:
APP_PROJECT_PATH := $(call my-dir)/project
APP_MODULES += fftw3
APP_OPTIM := release
APP_ABI := armeabi armeabi-v7a
a continuación, poner el paquete original FFTW3 bajo jni/fftw3/project/jni
.
En este punto debe generar un config.h
. Puede hacerlo utilizando un script de shell pequeño como this.
El último paso es crear el Makefile de Android necesario. En jni/fftw3/project/jni
poner un alto Android.mk
:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
include $(LOCAL_PATH)/api/sources.mk
include $(LOCAL_PATH)/dft/sources.mk
include $(LOCAL_PATH)/dft/scalar/sources.mk
include $(LOCAL_PATH)/dft/scalar/codelets/sources.mk
include $(LOCAL_PATH)/kernel/sources.mk
include $(LOCAL_PATH)/rdft/sources.mk
include $(LOCAL_PATH)/rdft/scalar/sources.mk
include $(LOCAL_PATH)/rdft/scalar/r2cb/sources.mk
include $(LOCAL_PATH)/rdft/scalar/r2cf/sources.mk
include $(LOCAL_PATH)/rdft/scalar/r2r/sources.mk
include $(LOCAL_PATH)/reodft/sources.mk
LOCAL_MODULE := fftw3
LOCAL_C_INCLUDES := $(LOCAL_PATH) \
$(LOCAL_PATH)/api \
$(LOCAL_PATH)/dft \
$(LOCAL_PATH)/dft/scalar \
$(LOCAL_PATH)/dft/scalar/codelets \
$(LOCAL_PATH)/kernel \
$(LOCAL_PATH)/rdft \
$(LOCAL_PATH)/rdft/scalar \
$(LOCAL_PATH)/rdft/scalar/r2cb \
$(LOCAL_PATH)/rdft/scalar/r2cf \
$(LOCAL_PATH)/rdft/scalar/r2r \
$(LOCAL_PATH)/reodft
# Use APP_OPTIM in Application.mk
LOCAL_CFLAGS := -g
include $(BUILD_SHARED_LIBRARY)
Frow ahora en adelante usted tiene que crear todos estos archivos sources.mk
. P. ej.un típico sources.mk
se parece a esto:
rdft/sources.mk
:
sources = buffered2.c \
buffered.c \
<....>
vrank-geq1.c \
vrank-geq1-rdft2.c
LOCAL_SRC_FILES += $(sources:%=rdft/%)
llamar al script ndk-build
en el directorio superior de su aplicación y se debe terminar con dos FFTW3 bibliotecas listas para su utilización:
libs/armeabi-v7a/libfftw3.so
libs/armeabi/libfftw3.so
impresionante tutorial, muchas gracias! –
Intenté esto pero parece asignar algunos archivos al lugar incorrecto en la jerarquía - Debo estar haciendo algo mal - ¿Alguna idea? Cargué mi árbol fuente aquí: https://www.dropbox.com/s/7ql1miwvsq8lqyg/fftw-android.tar.gz?n=125533085 – Julian