2010-11-17 159 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