嗨,我是新來的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