0

我找到了这个名为 SoundTouch-Android 的库。

我将jniandarmeabi-v7a文件夹复制到我的项目中。

转到jni终端中的文件夹后,我输入:

export ANDROID_NDK=~/daniele/Android/Sdk/ndk-bundle
export NDK_ROOT=$ANDROID_NDK
export PATH=${PATH}:${ANDROID_NDK}
ndk-build

这就是我得到的:

Android NDK: APP_PLATFORM not set. Defaulting to minimum supported version android-14.    
Android NDK: WARNING:/home/daniele/AndroidStudioProjects/Chords2/app/jni/Android.mk:soundtouch: non-system libraries in linker flags: -lgcc    
Android NDK:     This is likely to result in incorrect builds. Try using LOCAL_STATIC_LIBRARIES    
Android NDK:     or LOCAL_SHARED_LIBRARIES instead to list the library dependencies of the    
Android NDK:     current module    
Android NDK: WARNING:/home/daniele/AndroidStudioProjects/Chords2/app/jni/Android.mk:soundtouch: non-system libraries in linker flags: -lgcc    
Android NDK:     This is likely to result in incorrect builds. Try using LOCAL_STATIC_LIBRARIES    
Android NDK:     or LOCAL_SHARED_LIBRARIES instead to list the library dependencies of the    
Android NDK:     current module    
[armeabi-v7a] Compile++ thumb: soundtouch <= soundtouch-jni.cpp
[armeabi-v7a] Compile++ thumb: soundtouch <= AAFilter.cpp
[armeabi-v7a] Compile++ thumb: soundtouch <= FIFOSampleBuffer.cpp
[armeabi-v7a] Compile++ thumb: soundtouch <= FIRFilter.cpp
[armeabi-v7a] Compile++ thumb: soundtouch <= cpu_detect_x86.cpp
[armeabi-v7a] Compile++ thumb: soundtouch <= RateTransposer.cpp
[armeabi-v7a] Compile++ thumb: soundtouch <= SoundTouch.cpp
[armeabi-v7a] Compile++ thumb: soundtouch <= TDStretch.cpp
[armeabi-v7a] Compile++ thumb: soundtouch <= BPMDetect.cpp
[armeabi-v7a] Compile++ thumb: soundtouch <= PeakFinder.cpp
[armeabi-v7a] SharedLibrary  : libsoundtouch.so
[armeabi-v7a] Install        : libsoundtouch.so => libs/armeabi-v7a/libsoundtouch.so
[armeabi] Compile++ thumb: soundtouch <= soundtouch-jni.cpp
/home/daniele/AndroidStudioProjects/Chords2/app/jni/soundtouch-jni.cpp:133:2: error: 
      no matching function for call to 'convertInput16'
        convertInput16(ar, fBufferIn, BUFF_SIZE);
        ^~~~~~~~~~~~~~
/home/daniele/AndroidStudioProjects/Chords2/app/jni/soundtouch-jni.cpp:58:13: note: 
      candidate function not viable: no known conversion from
      'soundtouch::SAMPLETYPE *' (aka 'short *') to 'float *' for 2nd argument
static void convertInput16(jbyte*, float*, int);
            ^
/home/daniele/AndroidStudioProjects/Chords2/app/jni/soundtouch-jni.cpp:210:16: error: 
      no matching function for call to 'write'
                processed += write(fBufferIn, fBufferOut, nSamples * cha...
                             ^~~~~
/home/daniele/AndroidStudioProjects/Chords2/app/jni/soundtouch-jni.cpp:56:12: note: 
      candidate function not viable: no known conversion from
      'soundtouch::SAMPLETYPE *' (aka 'short *') to 'const float *' for 1st
      argument
static int write(const float*, queue<signed char>*, int, int);
           ^
2 errors generated.

我该如何解决?

更新:

Application.mk在按照 Dan Albert 的回答中的建议修改我之后,我尝试重建它。现在我得到了一个不同的日志,但仍然是一个我不知道如何修复的错误。

Android NDK: APP_PLATFORM not set. Defaulting to minimum supported version android-14.    
Android NDK: WARNING:/home/daniele/AndroidStudioProjects/Chords2/app/jni/Android.mk:soundtouch: non-system libraries in linker flags: -lgcc    
Android NDK:     This is likely to result in incorrect builds. Try using LOCAL_STATIC_LIBRARIES    
Android NDK:     or LOCAL_SHARED_LIBRARIES instead to list the library dependencies of the    
Android NDK:     current module    
[armeabi-v7a] Compile++ thumb: soundtouch <= soundtouch-jni.cpp
[armeabi-v7a] Compile++ thumb: soundtouch <= AAFilter.cpp
[armeabi-v7a] Compile++ thumb: soundtouch <= FIFOSampleBuffer.cpp
[armeabi-v7a] Compile++ thumb: soundtouch <= FIRFilter.cpp
[armeabi-v7a] Compile++ thumb: soundtouch <= cpu_detect_x86.cpp
[armeabi-v7a] Compile++ thumb: soundtouch <= RateTransposer.cpp
[armeabi-v7a] Compile++ thumb: soundtouch <= SoundTouch.cpp
[armeabi-v7a] Compile++ thumb: soundtouch <= TDStretch.cpp
/home/daniele/AndroidStudioProjects/Chords2/app/jni/soundtouch/source/SoundTouch/TDStretch.cpp:72:13: warning: 
      unused variable '_scanOffsets' [-Wunused-const-variable]
const short _scanOffsets[5][24]={
            ^
1 warning generated.
[armeabi-v7a] Compile++ thumb: soundtouch <= BPMDetect.cpp
[armeabi-v7a] Compile++ thumb: soundtouch <= PeakFinder.cpp
[armeabi-v7a] SharedLibrary  : libsoundtouch.so
/home/daniele/AndroidStudioProjects/Chords2/app/jni/soundtouch/source/SoundTouch/RateTransposer.cpp:296: error: undefined reference to 'soundtouch::InterpolateLinearFloat::InterpolateLinearFloat()'
/home/daniele/AndroidStudioProjects/Chords2/app/jni/soundtouch/source/SoundTouch/RateTransposer.cpp:302: error: undefined reference to 'soundtouch::InterpolateShannon::InterpolateShannon()'
/home/daniele/AndroidStudioProjects/Chords2/app/jni/soundtouch/source/SoundTouch/RateTransposer.cpp:299: error: undefined reference to 'soundtouch::InterpolateCubic::InterpolateCubic()'
clang++: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [/home/daniele/AndroidStudioProjects/Chords2/app/obj/local/armeabi-v7a/libsoundtouch.so] Error 1

我不太清楚它是否有用,但我会在Android.mk下面发布我的内容供您查看:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

# *** Remember: Change -O0 into -O2 in add-applications.mk ***

LOCAL_MODULE    := soundtouch
LOCAL_SRC_FILES := soundtouch-jni.cpp soundtouch/source/SoundTouch/AAFilter.cpp  soundtouch/source/SoundTouch/FIFOSampleBuffer.cpp \
                soundtouch/source/SoundTouch/FIRFilter.cpp soundtouch/source/SoundTouch/cpu_detect_x86.cpp \
                soundtouch/source/SoundTouch/RateTransposer.cpp soundtouch/source/SoundTouch/SoundTouch.cpp \
                soundtouch/source/SoundTouch/TDStretch.cpp soundtouch/source/SoundTouch/BPMDetect.cpp soundtouch/source/SoundTouch/PeakFinder.cpp

# for native audio
LOCAL_LDLIBS    += -lgcc 
LOCAL_C_INCLUDES += $(LOCAL_PATH)/soundtouch/include
# --whole-archive -lgcc 
# for logging
LOCAL_LDLIBS    += -llog
# for native asset manager
#LOCAL_LDLIBS    += -landroid
# don't export all symbols
# added "-marm" switch to use arm instruction set instead of thumb for improved calculation performance.
LOCAL_CFLAGS += -Wall -fvisibility=hidden -I soundtouch/source/../include -D ST_NO_EXCEPTION_HANDLING -fdata-sections -ffunction-sections -marm

include $(BUILD_SHARED_LIBRARY)
4

1 回答 1

1

看起来签入的代码可能刚刚损坏SOUND_TOUCH_INTEGER_SAMPLEShttps ://github.com/VladimirKulyk/SoundTouch-Android/blob/a614c7b37b0c4d58b20e0581aadfd6a43f3a5f2d/jni/soundtouch/include/STTypes.h#L139

看起来这是在第 85 行设置的。它只在没有浮点硬件的情况下这样做(可以从日志中看到,这对于大多数 ABI 来说都很好,但对于 arm5 来说却失败了)。我建议只禁用arm5。几乎所有的设备都可以做 arm7。在Application.mk 文件中,更改以下APP_ABI行:

APP_ABI := armeabi-v7a
于 2017-08-31T17:30:32.860 回答