用FFTWライブラリを共有:ビルは、私は次のスクリプトによってFFTWの共有ライブラリを構築しようとしていますAndroidの
INSTALL_DIR="`pwd`/jni/fftw3"
SRC_DIR="`pwd`/../fftw-3.3.4"
cd $SRC_DIR
NDK_ROOT=/path_to_android/Sdk/ndk-bundle
export PATH="$NDK_ROOT/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/:$PATH"
export SYS_ROOT="$NDK_ROOT/platforms/android-21/arch-arm/"
export CC="arm-linux-androideabi-gcc --sysroot=$SYS_ROOT"
export LD="arm-linux-androideabi-ld"
export AR="arm-linux-androideabi-ar"
export RANLIB="arm-linux-androideabi-ranlib"
export STRIP="arm-linux-androideabi-strip"
mkdir -p $INSTALL_DIR
./configure --enable-shared --host=arm-eabi --build=i386-linux --prefix=$INSTALL_DIR LIBS="-lc -lgcc" --enable-float
make
make install
exit 0
ただし、スクリプトを実行した後、私はいつもだけでもIかかわらず、静的FFTWライブラリを受け取りますイネーブル共有パラメータを使用しています。共有ライブラリファイルを生成する他の方法はありますか?
Android Studioは追加のJNIソースをコンパイルするために共有ライブラリを要求するので、本当に共有ライブラリが必要です。
更新:
@のbullsyの回答に基づいて、私は--host=arm-linux-androideabi
にhostパラメータをchaningで共有ライブラリを構築することができます。結果として生じる問題は、FFTWがライブラリファイルlibfftw.so.3
とlibfftw.so.3.4.4
でバージョン化された共有ライブラリを生成することです。これらのファイルを.so
ファイルに変換する方法を示した0が見つかりました。 libfftw3.so
またはlibfftw3.so.3
に取り組んでいる間、私はいつもファイルは、(通常の)ではないというエラーを受信しファイルので、私はlibfftw3.so.3.4.4
上のすべてのものを試してみました:
rpl -R -e libfftw3.so.3 libfftw3_3.so libfftw3.so.3.4.4
mv libfftw3.so.3.4.4 libfftw3_344.so
ln -sfn libfftw3_344.so libfftw3.so.3
mv libfftw3.so.3 libfftw3_3.so
私は手動でln
コマンドを追加する必要がありました。シンボリックリンクを変更することなく、Gradleはapkの構築プロセス中にlibfftw3_3.so
を見つけることができませんでした。
私のアプリケーションは共有ライブラリで動作していますが、単精度(-enable-float)の共有FFTWライブラリを生成することも可能ですか?
別のアプローチは、NDK-構築 Android.mkと によって静的ライブラリファイルを取るために、共有ライブラリファイルを構築することでした:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := fftw3
LOCAL_SRC_FILES := fftw3/lib/libfftw3.a
include $(PREBUILT_STATIC_LIBRARY)
LOCAL_MODULE := fftw_wrapper
LOCAL_C_INCLUDES := /path_to_fftw_headers/include
LOCAL_C_INCLUDES += /pat_to_wrapper/fftw_wrapper.h
LOCAL_SRC_FILES := fftw_wrapper.cpp
LOCAL_SHARED_LIBRARIES := fftw3f
include $(BUILD_SHARED_LIBRARY)
しかし、このアプローチは、常に未定義の参照を返します。エラー'fftw_malloc'への未定義参照。 Using FFTW on Android undefined references私は静的ライブラリを使用するたびに
、私のアプリケーションは、私は静的に fftw_wrapper をリンクしても、正常に動作:それはこの質問で説明されているように私はまた--buildパラメータなしでそれを試してみましたAndroid.mk。しかし、C/C++のインポートはすべてAndroid StudioのアプリのGradleファイルで定義されているため、Android.mkファイルに戻したいとは思いません。他の解決策はありますか?
ありがとうございました!このパラメータを使用すると、共有ライブラリを正常に作成できますが、_-- enable-float_パラメータを削除する必要があります。しかし、アプリケーションにライブラリをロードした場合。 'UnsatisfiedLinkError:dlopen failed:libfftw3.so.3が見つかりません 'というメッセージが表示されます。ファイルを1つだけ作成するようにFFTWに指示することはできますか、その追加ファイルをどのように読み込むことができますか?フロートを有効にすると、 'fftwf_codelet_n1_2'や' fftwf_codelet_hc2cb_2'のような 'fftwf_codelet_XX'ファイルへの未定義の参照がたくさんあります。 Android用の共有FFTWライブラリにfloatを有効にすることは可能ですか? – budderick