1

我正在开发一些适用于 Android 的音高校正软件,我希望使用 NDK 让 fftw3 在 Android 上工作。

音高校正库(talentedhack,http://code.google.com/p/talentledhack/以防万一有人想知道)依赖于 fftw3,所以我尝试将 fftw3 编译为静态库,然后将其链接到共享的有才华的黑客图书馆。目前我已经将 fftw3 构建为静态库 libfftw3.a,但我不断收到类似这样的未解决的参考错误

bin/ndk/local/armeabi/objs/talentedhack/fft.o: In function `fft_inverse':
jni/talentedhack/fft.c:51: undefined reference to `fftwf_execute'

使用 ndk-build 编译有才华的黑客共享库时。不过,它似乎正确地拾取了文件,这令人费解。

我的 Android.mk 文件的相关部分如下所示:

LOCAL_MODULE := talentedhack
LOCAL_CFLAGS := -std=c99
LOCAL_SRC_FILES := talentedhack.c other_source_files.c
LOCAL_C_INCLUDES := $(LOCAL_PATH)/fftw3/api
LOCAL_STATIC_LIBRARIES := fftw3
LOCAL_LDLIBS := -llog

include $(BUILD_SHARED_LIBRARY)

从项目顶层调用 ndk-build 时失败的命令是:

/opt/android-ndk-linux/build/prebuilt/linux-x86/arm-eabi-4.4.0/bin/arm-eabi-gcc -nostdlib -Wl,-soname,libtalentedhack.so -Wl,-shared,-Bsymbolic /path/to/project/bin/ndk/local/armeabi/objs/talentedhack/circular_buffer.o /path/to/project/bin/ndk/local/armeabi/objs/talentedhack/fft.o /path/to/project/bin/ndk/local/armeabi/objs/talentedhack/formant_corrector.o /path/to/project/bin/ndk/local/armeabi/objs/talentedhack/lfo.o /path/to/project/bin/ndk/local/armeabi/objs/talentedhack/pitch_detector.o /path/to/project/bin/ndk/local/armeabi/objs/talentedhack/pitch_shifter.o /path/to/project/bin/ndk/local/armeabi/objs/talentedhack/pitch_smoother.o /path/to/project/bin/ndk/local/armeabi/objs/talentedhack/quantizer.o /path/to/project/ndk/local/armeabi/objs/talentedhack/talentedhack.o -Wl,--whole-archive -Wl,--no-whole-archive /path/to/project/bin/ndk/local/armeabi/libfftw3.a /opt/android-ndk-linux/build/prebuilt/linux-x86/arm-eabi-4.4.0/bin/../lib/gcc/arm-eabi/4.4.0/libgcc.a /opt/android-ndk-linux/build/platforms/android-8/arch-arm/usr/lib/libc.so /opt/android-ndk-linux/build/platforms/android-8/arch-arm/usr/lib/libstdc++.so /opt/android-ndk-linux/build/platforms/android-8/arch-arm/usr/lib/libm.so -Wl,--no-undefined -Wl,-z,noexecstack -L/opt/android-ndk-linux/build/platforms/android-8/arch-arm/usr/lib -llog -Wl,-rpath-link=/opt/android-ndk-linux/build/platforms/android-8/arch-arm/usr/lib -o /path/to/project/bin/ndk/local/armeabi/libtalentedhack.so

我不确定这是否是 fftw3 的问题,因为我遵循了他们关于移植的说明(获取源文件的子集,手动配置并构建它们),因为系统实际上没有 fftwf_execute 或任何由于使用了一些花哨的宏,或者如果 Android NDK 构建系统无法正确处理静态库,则在任何头文件中定义的其他函数(我可以告诉)。任何帮助都将不胜感激。

4

0 回答 0