2010-11-17 17 views
7

hola soy nuevo en android-ndk hasta ahora trabajé con todas las aplicaciones de muestra en android-ndk, ahora estoy tratando de portar la biblioteca de fftw3 en android, ¿pueden por favor sugerirme algún tutorial para esto?compilando fftw3 en android ndk

Gracias.

Respuesta

1

Actualmente estoy resolviendo un problema similar, pero sin resultados significativos.

Como puedo recomendar, use una biblioteca bien probada como JTransforms (java pretty rapid) o encuentre la implementación de Badlogic KissFFT (JNI, aproximadamente 2 veces más rápido, numérico inestable).

17

El sistema de compilación FFTW3 hace uso de Autotools, por lo que no puede usarlo directamente con el NDK de Android. Una buena publicación de blog que trata este problema es here.

La idea es generar un archivo config.h adecuado fuera de línea y crear archivos Makefiles de Android, que reemplazan los desaparecidos normalmente generados por las Autotools.

Para lograr un diseño modular para los diferentes módulos nativos que podría utilizar, te recomiendo los siguientes:

En su directorio superior jni/ poner estos dos archivos:

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 

De esta forma puede agregar fácilmente un nuevo módulo creando un directorio jni/new_module_name y luego agregando new_module_name a la lista APP_MODULES.

A continuación, cree un nuevo directorio jni/fftw3 y poner otra Application.mk allí:

Application.mk:

APP_PROJECT_PATH := $(call my-dir)/project 
    APP_MODULES  += fftw3 
    APP_OPTIM  := release 
    APP_ABI   := armeabi armeabi-v7a 

a continuación, poner el paquete original FFTW3 bajo jni/fftw3/project/jni.

En este punto debe generar un config.h. Puede hacerlo utilizando un script de shell pequeño como this.

El último paso es crear el Makefile de Android necesario. En jni/fftw3/project/jni poner un alto 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) 

Frow ahora en adelante usted tiene que crear todos estos archivos sources.mk. P. ej.un típico sources.mk se parece a esto:

rdft/sources.mk:

sources = buffered2.c \ 
       buffered.c \ 
       <....> 
       vrank-geq1.c \ 
       vrank-geq1-rdft2.c 

    LOCAL_SRC_FILES += $(sources:%=rdft/%) 

llamar al script ndk-build en el directorio superior de su aplicación y se debe terminar con dos FFTW3 bibliotecas listas para su utilización:

  • libs/armeabi-v7a/libfftw3.so
  • libs/armeabi/libfftw3.so
+0

impresionante tutorial, muchas gracias! –

+0

Intenté esto pero parece asignar algunos archivos al lugar incorrecto en la jerarquía - Debo estar haciendo algo mal - ¿Alguna idea? Cargué mi árbol fuente aquí: https://www.dropbox.com/s/7ql1miwvsq8lqyg/fftw-android.tar.gz?n=125533085 – Julian

1

Después de notar que hay una tonelada de directorios nuevos en la versión reciente de fftw, que contienen .c y que no figuran en la versión original de Android.mk, me puse demasiado vago para escribir el script generador de fuente y luego busqué en Google:

include $(LOCAL_PATH)/api/sources.mk 

Gracias a Sudhakar Fomra (sfomra en github), hice mi construcción en pocos minutos.

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