当前位置: 代码迷 >> Android >> 移栽soundtouch到android 通过JNI来调用(二)
  详细解决方案

移栽soundtouch到android 通过JNI来调用(二)

热度:41   发布时间:2016-05-01 12:52:29.0
移植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的编译工作完成。

  相关解决方案