背景
先看两个场景:
怎么做到的?我也想装一波
今天带小伙伴们了解一下如何做到上面的效果。
fmod介绍
古人有云:视频界有ffmpeg,音频界有fmod。
下面的游戏大家伙可以看看,有没有眼熟的:
我随便截了几张图,有兴趣的可以到Fmod官网去具体了解。
怎么样有没有兴趣搞点有意思的玩玩,音频引擎已经有了。
我这边在调音编辑器里玩了一会,但是调音水平有限,不过多介绍了,有兴趣的自己down下来玩儿。
废话不多说,准备干活
第一步 先下载Android平台的引擎
第二步 下载后需要的文件:
.hpp是什么
.hpp,本质就是将.cpp的实现代码混入.h头文件当中,定义与实现都包含在同一文件,则该类的调用者只需要include该.hpp文件即可,无需再将cpp加入到project中进行编译。而实现代码将直接编译到调用者的obj文件中,不再生成单独的obj,采用hpp将大幅度减少调用project中的cpp文件数与编译次数,也不用再发布lib与dll文件,因此非常适合用来编写公用的开源库。
hpp的优点不少,但是编写中有以下几点要注意:
1、是Header Plus Plus的简写。(.h和.hpp就如同.c和.cpp似的)
2、与.h类似,.hpp是C++程序头文件格式。
3、是VCL专用的头文件,已预编译。
4、是一般模板类的头文件。
5、一般来说,.h里面只有声明,没有实现,而.hpp里声明实现都有,后者可以减少.cpp的数量。
6、.h里面可以有using namespace std,而.hpp里则无。
7、不可包含全局对象和全局函数。
新建项目并部署C/C++库步骤
第一步 新建Native Project
然后一路next 完事儿。
但是在运行的时候遇到了一个插曲(环境问题,可以忽略),仅做记录,各位看官大佬可以忽略。
- AS环境为最新版白狐
- AGP为最新版7.0.2
要求JDK为java 11,但是我主项目必须配置为jdk1.8,AS本身自带的就是java11所以我没有另外下载,而是直接在app的build.gradle里面
//app的build.gradle中android闭包下修改为
compileOptions {
sourceCompatibility JavaVersion.VERSION_11
targetCompatibility JavaVersion.VERSION_11
}
结果无效,不想折腾了所以降低agp版本,解决首次编译问题。
如果有大佬操作过不同项目配置不同jdk版本和环境变量的请不吝赐教。
最终可运行的项目如下
Cmake导入库流程
前置知识
CMake是什么?
一个跨平台构建系统
add_library 指令
语法:add_library(libname [SHARED | STATIC | MODULE] [EXCLUDE_FROM_ALL] [source])
将一组源文件 source 编译出一个库文件,并保存为 libname.so (lib 前缀是生成文件时 CMake自动添加上去的)。其中有三种库文件类型,不写的话,默认为 STATIC:
- SHARED: 表示动态库,可以在(Java)代码中使用 System.loadLibrary(name) 动态调用;
- STATIC: 表示静态库,集成到代码中会在编译时调用;
- MODULE: 只有在使用 dyId 的系统有效,如果不支持 dyId,则被当作 SHARED 对待;
- EXCLUDE_FROM_ALL: 表示这个库不被默认构建,除非其他组件依赖或手工构建
target_link_libraries 指令
语法:target_link_libraries(target library <debug | optimized> library2…)
这个指令可以用来为 target 添加需要的链接的共享库,同样也可以用于为自己编写的共享库添加共享库链接。
#指定 compress 工程需要用到 libjpeg 库和 log 库
target_link_libraries(compress libjpeg ${
log-lib})
第一步 导入头文件并声明
将上面提到的Fmod引擎Android平台的inc文件夹拷贝到项目的cpp文件下。并声明之:
//CMakeLists.txt
# 声明导入的头文件(以cpp文件夹为~)
include_directories("inc")
第二步 为了以后拓展,修改c文件引入形式(可忽略)
//CMakeLists.txt
# 批量导入所有源文件
file(GLOB allCPP *.c *.h *.cpp)
add_library(
voicechangeapp
SHARED
${
allCPP}
)
第三步 导入fmod库文件并配置
将上面提到的Fmod引擎Android平台的lib文件夹下面的arm64-v8a(armeabi、armeabi-v7a、x86等)放到src/main/jniLibs文件夹下。并在CMakeList.txt
中新增配置
//CMakeLists.txt
set(CMAKE_CXX_FLAGS "${
CMAKE_CXX_FLAGS} -L${
CMAKE_SOURCE_DIR}/../jniLibs/${
CMAKE_ANDROID_ARCH_ABI}")
target_link_libraries( # Specifies the target library.
voicechangeapp
log
fmod
fmodL
)
最终CMakeLists.txt文件为:
# For more information about using CMake with Android Studio, read the
# documentation: https://d.android.com/studio/projects/add-native-code.html
# Sets the minimum version of CMake required to build the native library.
cmake_minimum_required(VERSION 3.10.2)
# 声明导入的头文件(以cpp文件夹为~)
include_directories("inc")
# 批量导入所有源文件
file(GLOB allCPP *.c *</