Система сборки FFTW3 использует Autotools, поэтому вы не можете использовать ее непосредственно с Android NDK.
Хорошая запись в блоге, посвященная этой проблеме: здесь .
Идея состоит в том, чтобы создать правильный config.h
файл в автономном режиме и создать Android-файлы Makefile, которые заменят отсутствующие, обычно генерируемые Autotools.
Чтобы получить модульную компоновку для различных собственных модулей, которые вы можете использовать, я бы порекомендовал следующее:
В вашем верхнем каталоге jni/
поместите эти два файла:
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
Таким образом, вы можете легко добавить новый модуль, создав каталог jni/new_module_name
, а затем добавив new_module_name
в список APP_MODULES
.
Затем создайте новый каталог jni/fftw3
и поместите туда еще один Application.mk
:
Application.mk
APP_PROJECT_PATH := $(call my-dir)/project
APP_MODULES += fftw3
APP_OPTIM := release
APP_ABI := armeabi armeabi-v7a
Затем поместите оригинальную упаковку FFTW3 в jni/fftw3/project/jni
.
На данный момент вам нужно сгенерировать config.h
. Это можно сделать с помощью небольшого сценария оболочки, например this .
Последний шаг - создать необходимый Android Makefile. В jni/fftw3/project/jni
поставить топ 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)
Хм, теперь вам нужно создать все эти sources.mk
файлы.
Например. типичный sources.mk
выглядит так:
rdft/sources.mk
sources = buffered2.c \
buffered.c \
<....>
vrank-geq1.c \
vrank-geq1-rdft2.c
LOCAL_SRC_FILES += $(sources:%=rdft/%)
Вызовите скрипт ndk-build
в верхнем каталоге вашего приложения, и вы получите две готовые к использованию библиотеки FFTW3:
libs/armeabi-v7a/libfftw3.so
libs/armeabi/libfftw3.so