上一篇博客中寫到了如何編譯和安裝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的編譯工作完成。