Android NDK - 编译库时出错

问题描述:

我发现了this library,它被称为SoundTouch-Android。Android NDK - 编译库时出错

我将jniarmeabi-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. 

我怎样才能解决呢?

UPDATE:

我想修改我Application.mk在丹艾伯特的回答表明后重建它。现在我得到了一个不同的日志,但仍然是一个错误,我不知道如何解决。

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) 
+0

你定义自己的'write'功能?定义与标准库中的函数名称相同的函数可能是一个糟糕的主意...... –

+0

不,我没有自己定义它。我只是试图建立图书馆,因为我从问题中提供的链接下载它。我猜它已经与android.mk有关,尽管我现在不能发布它。我稍后会更新这个问题。 – Daniele

看起来也许这就是在刚刚打破了检查代码SOUND_TOUCH_INTEGER_SAMPLEShttps://github.com/VladimirKulyk/SoundTouch-Android/blob/a614c7b37b0c4d58b20e0581aadfd6a43f3a5f2d/jni/soundtouch/include/STTypes.h#L139

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

APP_ABI := armeabi-v7a 
+0

好的,可以做。但是因为我完全不熟悉这个,你会介意解释我该怎么做吗? – Daniele

+0

更新了答案。 –

+0

非常感谢,以后会试用 – Daniele