嗨,我是新来的android-ndk到目前为止,我在android-ndk中的所有示例应用程序,现在我想尝试移植android中的fftw3库,你可以plz建议我任何这个教程。在android ndk编译fftw3 ndk
谢谢。
嗨,我是新来的android-ndk到目前为止,我在android-ndk中的所有示例应用程序,现在我想尝试移植android中的fftw3库,你可以plz建议我任何这个教程。在android ndk编译fftw3 ndk
谢谢。
我目前正在解决类似的问题,但没有明显的结果。
因为我可以推荐使用像JTransforms(Java相当快)的花药测试库,或者找到Badlogic KissFFT实现(JNI,速度快2倍,数值不稳定)。
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
注意到,在最近的fftw版本中有很多新的目录,其中包含.c并且没有在原始的Android.mk中列出,所以我懒得编写source.mk生成脚本,并用google代替:
include $(LOCAL_PATH)/api/sources.mk
感谢Sudhakar Fomra(在github上的sfomra),在几分钟内完成了我的构建。
真棒教程,非常感谢! – 2011-10-04 08:01:09
我试过这个,但它似乎将一些文件映射到错误的地方 - 我必须做错什么 - 任何想法?我在这里上传了我的源代码树:https://www.dropbox.com/s/7ql1miwvsq8lqyg/fftw-android.tar.gz?n=125533085 – Julian 2013-06-02 16:31:47