компиляция fftw3 в android ndk - PullRequest
       3

компиляция fftw3 в android ndk

7 голосов
/ 17 ноября 2010

Привет, я новичок в android-ndk. До сих пор я работал со всеми примерами приложений в android-ndk, сейчас я пытаюсь перенести библиотеку fftw3 в android. Можете ли вы предложить мне любой учебник для этого.

Спасибо.

Ответы [ 5 ]

17 голосов
/ 05 сентября 2011

Система сборки FFTW3 использует Autotools, поэтому вы не можете использовать ее непосредственно с Android NDK. Хорошая запись в блоге, посвященная этой проблеме: здесь .

Идея состоит в том, чтобы создать правильный config.h файл в автономном режиме и создать Android-файлы Makefile, которые заменят отсутствующие, обычно генерируемые 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
1 голос
/ 06 января 2014

Заметив, что в последней версии fftw есть тонна новых каталогов, содержащих .c и не перечисленных в исходном Android.mk, я поленился написать скрипт, генерирующий source.mk, и вместо этого гуглил: 1001 *

include $(LOCAL_PATH)/api/sources.mk

Благодаря Судхакару Фомре (сфомре на github) моя сборка была сделана за несколько минут.

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

1 голос
/ 03 мая 2011

Я в настоящее время решаю подобную проблему, но без существенных результатов.

Как я могу порекомендовать использовать другую хорошо проверенную библиотеку, такую ​​как JTransforms (java довольно быстро) или найти реализацию Badlogic KissFFT (JNI, примерно в 2 раза быстрее, числовая нестабильна).

0 голосов
/ 12 февраля 2019

Довольно безболезненно, FFTW может быть построен для Android с его официальным сценарием CMake в http://fftw.org/fftw-3.3.8.tar.gz:

externalNativeBuild {
    cmake {
        arguments "-DANDROID_ARM_NEON=TRUE"
        arguments "-DCMAKE_BUILD_TYPE=Release"
        arguments "-DBUILD_SHARED_LIBS=OFF"
        arguments "-DBUILD_TESTS=OFF"
        arguments "-DDISABLE_FORTRAN=ON"
        arguments "-DENABLE_FLOAT=ON"
        targets "fftw3f"
    }
}
0 голосов
/ 21 августа 2018

Лучший способ скомпилировать fftw3 для Android armeabi-v7a:

export SYSROOT="$NDK_ROOT/platforms/$TARGET/arch-arm"
export CFLAGS="-I$NDK_ROOT/platforms/$TARGET/arch-arm/usr/include --sysroot=$SYSROOT"
export CPPFLAGS="-I$NDK_ROOT/platforms/$TARGET/arch-arm/usr/include --sysroot=$SYSROOT"
export CC=$($NDK_ROOT/ndk-which gcc)
export LD=$($NDK_ROOT/ndk-which ld)
export CPP=$($NDK_ROOT/ndk-which cpp)
export CXX=$($NDK_ROOT/ndk-which g++)
export AS=$($NDK_ROOT/ndk-which as)
export AR=$($NDK_ROOT/ndk-which ar)
export RANLIB=$($NDK_ROOT/ndk-which ranlib)
./configure --host=arm-linux-androideabi --target=arm-linux-androideabi
make OS=android NDKROOT=$NDK_ROOT TARGET=android-9 ARCH=arm NDKLEVEL=9
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...