2010-11-17 161 views
7

嗨,我是新来的android-ndk到目前为止,我在android-ndk中的所有示例应用程序,现在我想尝试移植android中的fftw3库,你可以plz建议我任何这个教程。在android ndk编译fftw3 ndk

谢谢。

回答

1

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

因为我可以推荐使用像JTransforms(Java相当快)的花药测试库,或者找到Badlogic KissFFT实现(JNI,速度快2倍,数值不稳定)。

17

FFTW3构建系统使用Autotools,因此您无法直接使用Android NDK。 处理此问题的好博客文章是here

这个想法是离线生成一个合适的config.h文件,并创建Android Makefiles,它取代了通常由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
+0

真棒教程,非常感谢! – 2011-10-04 08:01:09

+0

我试过这个,但它似乎将一些文件映射到错误的地方 - 我必须做错什么 - 任何想法?我在这里上传了我的源代码树:https://www.dropbox.com/s/7ql1miwvsq8lqyg/fftw-android.tar.gz?n=125533085 – Julian 2013-06-02 16:31:47

1

注意到,在最近的fftw版本中有很多新的目录,其中包含.c并且没有在原始的Android.mk中列出,所以我懒得编写source.mk生成脚本,并用google代替:

include $(LOCAL_PATH)/api/sources.mk 

感谢Sudhakar Fomra(在github上的sfomra),在几分钟内完成了我的构建。

https://github.com/sfomra/FFTW3_MOD-for-Android