其实之前很长一段时间都在研究音视频的知识,只是没有总结知识。后来太忙导致以前学的都忘了好多,最近买了音视频开发的书来系统学习,但是里头的部分代码是eclipse的,现在基本上不用eclipse开发了,所以我还是选择在Android Studio中进行实践,在此记录一下学习中的要点。代码均是参考https://github.com/zhanxiaokai,也就是该书的源码仓库。本文所用环境为Android Studio3.1.2,目前的最新稳定版。本文不会从编译开始讲起,只会提一些自己认为的关键代码,以及项目构建时候的一些坑,读者需要有一定ndk开发知识。
搭建Android Studio的c++项目
新建项目的时候选择包含c++项目
最后选上支持c++11特性、异常以及运行时类型识别
接下来我们在build.gralde中添加如下代码
apply plugin: 'com.android.application'
ext {
boolean isWindow = isWindowsOS();
if(isWindow){
native_sdk_path = rootDir.getAbsolutePath().replace('\\','/') + "/app"
}else{
native_sdk_path = file(rootDir.getAbsolutePath() + "/app")
}
}
/** 判断是否为Windows操作系统 */
boolean isWindowsOS(){
boolean isWindowsOS = false;
String osName = System.getProperty("os.name");
println("os.name=" + osName);
if(osName == null || "".equals(osName)) {
return false;
}
if(osName.toLowerCase().indexOf("windows") > -1){
isWindowsOS = true;
}
return isWindowsOS;
}
android {
...
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
ndk {
abiFilters 'armeabi-v7a'
}
buildTypes {
debug{
debuggable true
jniDebuggable true
externalNativeBuild {
cmake {
arguments '-DANDROID_PLATFORM=android-16', '-DANDROID_TOOLCHAIN=clang',
'-DANDROID_ARM_NEON=TRUE', '-DANDROID_STL=gnustl_static',
"-DPATH_TO_MEDIACORE:STRING=${native_sdk_path}"
cFlags '-O3', '-DGL_GLEXT_PROTOTYPES', '-DEGL_EGLEXT_PROTOTYPES', '-fsigned-char', "-I${native_sdk_path}", '-Wformat','-mfpu=neon', '-mfloat-abi=softfp -frtti' // full optimization, char data type is signed
// 编译优化,设置函式是否能被 inline 的伪指令长度
cppFlags '-O3', '-fexceptions', '-fsigned-char',
"-frtti -std=c++11", '-Wformat'
}
}
}
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
externalNativeBuild {
cmake {
arguments '-DANDROID_PLATFORM=android-16', '-DANDROID_TOOLCHAIN=clang',
'-DANDROID_ARM_NEON=TRUE', '-DANDROID_STL=gnustl_static',
'-DCMAKE_BUILD_TYPE=RelWithDebInfo',
"-DPATH_TO_MEDIACORE:STRING=${native_sdk_path}"
cFlags '-O3', '-DGL_GLEXT_PROTOTYPES', '-DEGL_EGLEXT_PROTOTYPES', '-fsigned-char', "-I${native_sdk_path}", '-Wformat','-mfpu=neon', '-mfloat-abi=softfp -frtti' // full optimization, char data type is signed
// 编译优化,设置函式是否能被 inline 的伪指令长度
cppFlags '-O3', '-fexceptions', '-fsigned-char',
"-frtti -std=c++11", '-Wformat'
}
}
}
}
externalNativeBuild {
cmake {
path "src/main/cpp/CMakeLists.txt"
}
}
}
简单说一下配置,这里我们需要将根app目录添加到cmake的cache中方便获取,arguments 中的-D就是在cmake构建的时候生成的CMakeCache.txt中定义的变量,可以直接在camke脚本中获取。这里的比如-DANDROID_PLATFORM定义是内部特殊属性,可以参考官网https://developer.android.com/ndk/guides/cmake。然后下面是一些c和cxx的编译参数,大部分是一些优化选项,具体可以参考我的这篇文章https://blog.youkuaiyun.com/a568478312/article/details/79195218。接着我们指