Search code examples
androidandroid-ndksoundtouch

Android NDK - Error while compiling library


I found this library which is called SoundTouch-Android.

I copied the jni and the armeabi-v7a folder into my project.

after going to the jni folder in terminal I typed:

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

This is what I got:

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.

How can I fix it?

UPDATE:

I tried rebuilding it after modifying my Application.mk as suggested in Dan Albert's answer. Now I got a different log, but still an error I don't know how to fix.

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

I don't quite know if it's useful but I'll post my Android.mk below for you to check out:

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)

Solution

  • It looks like maybe the code that's checked in is just broken for SOUND_TOUCH_INTEGER_SAMPLES: https://github.com/VladimirKulyk/SoundTouch-Android/blob/a614c7b37b0c4d58b20e0581aadfd6a43f3a5f2d/jni/soundtouch/include/STTypes.h#L139

    It looks like that was set on line 85. It only does this for the case of not having floating point hardware (can see from the log that this built fine for most ABIs, it just failed for arm5). I'd recommend just disabling arm5. Pretty much every device out there can do arm7. In the Application.mk file, change the APP_ABI line:

    APP_ABI := armeabi-v7a