2016-05-05 1 views
0

用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.3libfftw.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ファイルに戻したいとは思いません。他の解決策はありますか?

答えて

1

ではなく

--host=arm-linux-androideabi 

を使用してみてください。これは、configureに 'ねえ、私はLinuxの変種のためにビルドしています'と言っています。共有ライブラリをデフォルトの選択にします。

+0

ありがとうございました!このパラメータを使用すると、共有ライブラリを正常に作成できますが、_-- 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

関連する問題