为Android构建共享的FFTW库

时间:2016-05-05 13:35:18

标签: android-ndk java-native-interface shared-libraries fftw

我正在尝试通过以下脚本构建一个FFTW共享库:

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

然而,在执行脚本后,即使我使用 enable-shared 参数,我也始终只接收静态FFTW库。有没有其他方法来生成共享库文件?
我真的需要一个共享库,因为Android Studio需要一个共享库来编译其他JNI源。

更新
基于@ bullsy的答案,我可以通过将主机参数转换为--host=arm-linux-androideabi来构建共享库。由此产生的问题是FFTW生成了一个带有库文件libfftw.so.3libfftw.so.3.4.4的版本化共享库。我找到了tutorial,其中显示了如何将这些文件转换为.so个文件。在处理libfftw3.solibfftw3.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 所以我的应用程序现在正在运行共享库,但是也可以生成单精度的共享FFTW库( -enable-float )?

<小时/> 另一种方法是获取静态库文件并通过 Android.mk ndk-build 构建共享库文件:

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)

但是这种方法总是返回未定义的引用错误,例如未定义引用&quot; fftw_malloc&#39;。我也尝试过没有 - build 参数,因为在这个问题中对此进行了解释:Using FFTW on Android undefined references

每当我使用静态库时,我的应用程序运行正常,即使我静态链接 Android.mk 中的 fftw_wrapper 。但是,由于我的C / C ++导入都是在Android Studio的应用程序Gradle文件中定义的,所以我不想更改回Android.mk文件。还有其他解决方案吗?

1 个答案:

答案 0 :(得分:1)

尝试使用

--host=arm-linux-androideabi

代替。这告诉configure'Hey,我正在构建一个linux变体',这使得共享库成为默认选择。

相关问题