c++ - Android ndk编译SoundTouch Library报错

标签 c++ android-ndk java-native-interface undefined-reference android.mk

我有一个 Android NDK 项目,它在 SoundTouch 库的 NDK_Build 期间失败。

构建日志

izzy@NebulaesGate:~/warspace/AudioAnalyzerLib/jni$ /home/izzy/warspace/adt-bundle-linux-x86-20140321/ndk/ndk-build 
Android NDK: WARNING: APP_PLATFORM android-19 is larger than android:minSdkVersion 8 in /home/izzy/warspace/AudioAnalyzerLib/AndroidManifest.xml    
Android NDK: WARNING: Ignoring invalid values in LOCAL_CPP_FEATURES definition in /home/izzy/warspace/AudioAnalyzerLib/jni/Android.mk: -fno-exceptions    
[armeabi] Compile++ thumb: SoundTouch <= AAFilter.cpp
[armeabi] Compile++ thumb: SoundTouch <= BPMDetect.cpp
[armeabi] Compile++ thumb: SoundTouch <= cpu_detect_x86.cpp
[armeabi] Compile++ thumb: SoundTouch <= FIFOSampleBuffer.cpp
[armeabi] Compile++ thumb: SoundTouch <= FIRFilter.cpp
/home/izzy/warspace/AudioAnalyzerLib/jni/SoundTouch/FIRFilter.cpp: In static member function 'static soundtouch::FIRFilter* soundtouch::FIRFilter::newInstance()':
/home/izzy/warspace/AudioAnalyzerLib/jni/SoundTouch/FIRFilter.cpp:294:10: warning: variable 'uExtensions' set but not used [-Wunused-but-set-variable]
[armeabi] Compile++ thumb: SoundTouch <= mmx_optimized.cpp
[armeabi] Compile++ thumb: SoundTouch <= PeakFinder.cpp
/home/izzy/warspace/AudioAnalyzerLib/jni/SoundTouch/PeakFinder.cpp: In member function 'int soundtouch::PeakFinder::findCrossingLevel(float const*, float, int, int) const':
/home/izzy/warspace/AudioAnalyzerLib/jni/SoundTouch/PeakFinder.cpp:146:11: warning: variable 'peaklevel' set but not used [-Wunused-but-set-variable]
[armeabi] Compile++ thumb: SoundTouch <= RateTransposer.cpp
/home/izzy/warspace/AudioAnalyzerLib/jni/SoundTouch/RateTransposer.cpp: In member function 'void soundtouch::RateTransposer::processSamples(const SAMPLETYPE*, uint)':
/home/izzy/warspace/AudioAnalyzerLib/jni/SoundTouch/RateTransposer.cpp:133:10: warning: variable 'count' set but not used [-Wunused-but-set-variable]
[armeabi] Compile++ thumb: SoundTouch <= SoundTouch.cpp
[armeabi] Compile++ thumb: SoundTouch <= sse_optimized.cpp
[armeabi] Compile++ thumb: SoundTouch <= TDStretch.cpp
/home/izzy/warspace/AudioAnalyzerLib/jni/SoundTouch/TDStretch.cpp: In static member function 'static soundtouch::TDStretch* soundtouch::TDStretch::newInstance()':
/home/izzy/warspace/AudioAnalyzerLib/jni/SoundTouch/TDStretch.cpp:627:10: warning: variable 'uExtensions' set but not used [-Wunused-but-set-variable]
[armeabi] SharedLibrary  : libSoundTouch.so
/home/izzy/warspace/adt-bundle-linux-x86-20140321/ndk/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: /home/izzy/warspace/AudioAnalyzerLib/obj/local/armeabi/objs/SoundTouch/SoundTouch/RateTransposer.o: in function soundtouch::TransposerBase::newInstance():/home/izzy/warspace/AudioAnalyzerLib/jni/SoundTouch/RateTransposer.cpp:284: error: undefined reference to 'soundtouch::InterpolateLinearInteger::InterpolateLinearInteger()'
collect2: ld returned 1 exit status
make: *** [/home/izzy/warspace/AudioAnalyzerLib/obj/local/armeabi/libSoundTouch.so] Error 1

我知道它有一个 undefined reference 错误,但我不明白。 RateTransposer.cpp 包括 InterpolateLinear.h

#include "InterpolateLinear.h"

这是失败的代码

#ifdef SOUNDTOUCH_INTEGER_SAMPLES
    // Notice: For integer arithmetics support only linear algorithm (due to simplest calculus)
    return new InterpolateLinearInteger; # <<<<<________________LINE 284
#else

这是我的Android.mk文件

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)

LOCAL_CPP_FEATURES += -fno-exceptions

LOCAL_SRC_FILES := \
     SoundTouch/AAFilter.cpp \
     SoundTouch/BPMDetect.cpp \
     SoundTouch/cpu_detect_x86.cpp\
      SoundTouch/FIFOSampleBuffer.cpp \
      SoundTouch/FIRFilter.cpp \
      SoundTouch/mmx_optimized.cpp \
      SoundTouch/PeakFinder.cpp \
      SoundTouch/RateTransposer.cpp \
      SoundTouch/SoundTouch.cpp \
      SoundTouch/sse_optimized.cpp \
      SoundTouch/TDStretch.cpp 

LOCAL_MODULE := libSoundTouch

LOCAL_C_INCLUDES := include/ #include/BPMDetect.h include/FIFOSampleBuffer.h include/FIFOSamplePipe.h include/SoundTouch.h include/STTypes.h

LOCAL_CFLAGS += -Wall -fvisibility=hidden -I include -D ST_NO_EXCEPTION_HANDLING -fdata-sections -ffunction-sections -marm

include $(BUILD_SHARED_LIBRARY)

感谢您的帮助, 乔

最佳答案

我想通了。

我在 RateTransposer.cpp 之前将“SoundTouch/InterpolateLinear.cpp\”添加到我的 Android.mk 文件 ...

关于c++ - Android ndk编译SoundTouch Library报错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24129079/

相关文章:

c++ - 基于类型的条件编译

Android NDK - 从源代码构建共享库

android - 从 .aar 文件 Android 中提取代码

c++ - 具有内存分配的函数中的C++析构函数静态变量

c++ - 为迷宫实现一棵树以在 DFS、BFS 中使用

android - 使用 Android NDK 在 C 或 C++ 中创建 react-native Native 模块?

android - CMake 链接静态库错误,而 NDK 工作正常

java - 链接依赖库时JNI "The specified procedure could not be found"

java - JVM如何调用宿主机环境中的native方法

c++ - 如何通过 UI 线程类 Run() 函数在对话框编辑框中显示字符串