移植soundtouch到android 通過JNI來調用(二)

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

發佈了44 篇原創文章 · 獲贊 32 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章