嗨,我是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_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
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.solibs/armeabi/libfftw3.so我目前正在解决类似的问题,但没有显着的结果。
因为我可以推荐使用另一个经过良好测试的库,如 JTransforms(java 相当快)或找到 Badlogic KissFFT 实现(JNI,大约快 2 倍,数值不稳定)。
| 归档时间: |
|
| 查看次数: |
6540 次 |
| 最近记录: |