1. 背景
最近项目需要实现音频不变速变调,查询了开源库,主要有soundtouch。
官方对应的Android Demo源码为eclipse,使用的native代码路径也为相对路径。本篇文章主要记录把Android Demo迁移到Android Studio,成功编译出so文件,正常运行demo。
2. 迁移到Android Studio
- 下载soundtouch最新代码
git clone https://gitlab.com/soundtouch/soundtouch.git
- 打开Android Studio导入Android Demo
android demo路径如下:
/Users/mac/work/code/android/soundtouch/source/Android-lib
打开Android Studio选择Import project(Gradle,Eclipse ADT,etc.)导入项目
- 此时Android Studio会自动将Eclipse项目转换为Android Studio项目格式
- 项目取名SoundTouchAndroidLib。
- 配置NDK环境
(1)在项目SoundTouchAndroidLib/gradle.properties新增
android.useDeprecatedNdk=true
如果没有gradle.properties新建一个即可 (2)下载ndk
- 选中Cmake,LLDB,NDK点击Apply即可下载对应文件。 (3)为项目配置ndk路径 配置ndk路径 (4)在/Users/mac/work/code/SoundTouchAndroidLib/app/build.gradle添加
sourceSets.main {
jni.srcDirs = ['libs']
}
(5)拷贝soudntouch native代码到项目
新建目录/Users/mac/work/code/SoundTouchAndroidLib/app/src/main/jni/SoundTouch,拷贝native代码,主要包括
-
soundtouch/source/SoundTouch
-
soundtouch/source/SoundStretch
-
soundtouch/include
(6)找到STTypes.h头文件,将#define ST_NO_EXCEPTION_HANDLING 1 原先的注释去掉。 (7)修改.h引用路径 -
打开jni/source-jni.cpp,将
#include "../../../include/SoundTouch.h"
#include "../source/SoundStretch/WavFile.h"
修改为
#include "SoundTouch/include/SoundTouch.h"
#include "SoundTouch/SoundStretch/WavFile.h"
- 打开jni/Android.mk,将
LOCAL_MODULE := soundtouch
LOCAL_SRC_FILES := soundtouch-jni.cpp ../../SoundTouch/AAFilter.cpp ../../SoundTouch/FIFOSampleBuffer.cpp \
../../SoundTouch/FIRFilter.cpp ../../SoundTouch/cpu_detect_x86.cpp \
../../SoundTouch/sse_optimized.cpp ../../SoundStretch/WavFile.cpp \
../../SoundTouch/RateTransposer.cpp ../../SoundTouch/SoundTouch.cpp \
../../SoundTouch/InterpolateCubic.cpp ../../SoundTouch/InterpolateLinear.cpp \
../../SoundTouch/InterpolateShannon.cpp ../../SoundTouch/TDStretch.cpp \
../../SoundTouch/BPMDetect.cpp ../../SoundTouch/PeakFinder.cpp
# for native audio
LOCAL_SHARED_LIBRARIES += -lgcc
修改为
LOCAL_MODULE := soundtouch
LOCAL_SRC_FILES := soundtouch-jni.cpp \
SoundTouch/SoundTouch/AAFilter.cpp \
SoundTouch/SoundTouch/FIFOSampleBuffer.cpp \
SoundTouch/SoundTouch/FIRFilter.cpp \
SoundTouch/SoundTouch/cpu_detect_x86.cpp \
SoundTouch/SoundTouch/sse_optimized.cpp \
SoundTouch/SoundStretch/WavFile.cpp \
SoundTouch/SoundTouch/RateTransposer.cpp \
SoundTouch/SoundTouch/SoundTouch.cpp \
SoundTouch/SoundTouch/InterpolateCubic.cpp \
SoundTouch/SoundTouch/InterpolateLinear.cpp \
SoundTouch/SoundTouch/InterpolateShannon.cpp \
SoundTouch/SoundTouch/TDStretch.cpp \
SoundTouch/SoundTouch/BPMDetect.cpp \
SoundTouch/SoundTouch/PeakFinder.cpp \
# for native audio
# LOCAL_SHARED_LIBRARIES += -lgcc
==注意==-lgcc这行注释掉了
3. NDK编译出so文件
(1)在Terminal工具运行,编译so
/Users/mac/work/code/env/android-ndk-r20/ndk-build NDK_PROJECT_PATH=/Users/mac/work/code/SoundTouchAndroidLib/app/src/main
(2)报错路径不对 /Users/mac/work/code/SoundTouchAndroidLib/app/src/main/jni/SoundTouch/SoundTouch/xx.h文件的include路径都需要修改下。
- 我是编译一次编译,发现一个错误改一个路径,有点傻。 (3)输出so 如果xx.h文件的include路径修改完毕,应该就可以得到so文件了。 (4)扫尾
- /Users/mac/work/code/SoundTouchAndroidLib/app/src/main/下的libs文件夹重命名为jniLibs
- /Users/mac/work/code/SoundTouchAndroidLib/app/src/main/下的obj文件夹删除
4. 运行demo,验证变调效果
- 找一个wav文件即可对效果进行验证。
5. 总结
- 实践出真知