上一篇博客中写到了如何编译和安装soundtouch
当安装soundtouch到你的ubuntu中后你可以通过运行soundstretch来体验一下soundtouch的用法,
当然如果你运行soundstretch提示找不到lib的话你需要将/usr/local/lib 下面与soundtouch相关的lib放到/usr/lib下面
至于soundstretch的用法,可以通过自带的文档来了解。
下面进入正题来通过NDK来编译soundtouch 的jni lib
先贴出我的Application.mk
#Begin:added by vincnet 2012-11-19
# The ARMv7 is significanly faster due to the use of the hardware FPU
APP_ABI := armeabi
APP_PLATFORM := android-9
APP_STL := gnustl_static
#APP_MODULES := soundtouch \
jniSoundTouch
#End
我先也没有加Application.mk文件,这个在一般的jni lib编译中并不是必须的。
但是soundtouch必须要 它里面用到了c++的一些标准容器所以需要用APP_STL来指定STL库
下面贴出我的Android.mk文件
#Begin:added by vincent 2012-11-19
#autor: Vincent Luo
#data : Nov17 2012
#==================soundtouch lib=====================
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := soundtouch
LOCAL_C_INCLUDES := $(LOCAL_PATH)/soundtouch/include
LOCAL_SRC_FILES := soundtouch/source/AAFilter.cpp \
soundtouch/source/FIRFilter.cpp \
soundtouch/source/RateTransposer.cpp \
soundtouch/source/sse_optimized.cpp \
soundtouch/source/BPMDetect.cpp \
soundtouch/source/RunParameters.cpp \
soundtouch/source/TDStretch.cpp \
soundtouch/source/cpu_detect_x86.cpp \
soundtouch/source/mmx_optimized.cpp \
soundtouch/source/SoundTouch.cpp \
soundtouch/source/WavFile.cpp \
soundtouch/source/FIFOSampleBuffer.cpp \
soundtouch/source/PeakFinder.cpp \
soundtouch/source/main.cpp
LOCAL_CFLAGS += -DANDROID
include $(BUILD_STATIC_LIBRARY)
#==================soundtouch jni lib=================
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
#LOCAL_PREBUILT_LIBS:= \
libsoundtouch.a
LOCAL_MODULE := jniSoundTouch
LOCAL_C_INCLUDES:= $(LOCAL_PATH)/soundtouch/include
#LOCAL_SRC_FILES := jniSoundTouch.cpp
LOCAL_LDLIBS := -lm -llog -landroid
LOCAL_STATIC_LIBRARIES := soundtouch
include $(BUILD_SHARED_LIBRARY)
#End
其中的jniSoundTouch.cpp就需要自己来写JNI的接口供上层来调用了,这里就不贴出来了。
另外需要指名的是编译过程中会遇到关于异常处理方面的东西,我们需要将
STTypes.h中150行的
#define ST_NO_EXCEPTION_HANDLING 1
宏打开,将异常处理去除掉。然后将还有两个地方中有使用try catch的用这个宏来注释一下。
这样就可以编译出一个静态库libsoundtouch.a和libjniSoundTouch.so 我们在java代码中只需要加载动态库
到此,soundtouch的编译工作完成。