在android ndk中编译fftw3

ima*_*aya 7 android-ndk

嗨,我是android-ndk的新手,到目前为止我使用android-ndk中的所有示例应用程序,现在我想在android中移植fftw3库,你能不能为我推荐任何教程.

谢谢.

Mat*_*let 17

FFTW3构建系统使用Autotools,因此您无法直接将其与Android NDK一起使用.一个好的博客文章处理这一问题是在这里.

这个想法是config.h离线生成一个合适的文件并创建Android Makefile,它取代了通常由Autotools生成的缺失文件.

要为您可能使用的不同本机模块实现模块化布局,我建议如下:

在您的顶级jni/目录中放置以下两个文件:

Application.mk:

    APP_OPTIM        := release
    APP_ABI          := armeabi armeabi-v7a
    APP_MODULES      := fftw3
Run Code Online (Sandbox Code Playgroud)

Android.mk:

    TOP_DIR := $(call my-dir)
    include $(TOP_DIR)/fftw3/project/jni/Android.mk
Run Code Online (Sandbox Code Playgroud)

这样,您可以通过创建jni/new_module_name目录然后添加new_module_nameAPP_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
Run Code Online (Sandbox Code Playgroud)

然后把原来的FFTW3包放在下面jni/fftw3/project/jni.

此时你需要生成一个config.h.您可以使用像这样的小shell脚本来完成此操作.

最后一步是创建所需的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)
Run Code Online (Sandbox Code Playgroud)

现在,你必须创建所有这些sources.mk文件.例如,典型sources.mk看起来像这样:

rdft/sources.mk:

    sources = buffered2.c \
              buffered.c \
              <....>
              vrank-geq1.c \
              vrank-geq1-rdft2.c

    LOCAL_SRC_FILES += $(sources:%=rdft/%)
Run Code Online (Sandbox Code Playgroud)

调用ndk-build应用程序顶级目录中的脚本,最终应该有两个即用型FFTW3库:

  • libs/armeabi-v7a/libfftw3.so
  • libs/armeabi/libfftw3.so


Tom*_*lek 1

我目前正在解决类似的问题,但没有显着的结果。

因为我可以推荐使用另一个经过良好测试的库,如 JTransforms(java 相当快)或找到 Badlogic KissFFT 实现(JNI,大约快 2 倍,数值不稳定)。