Android开发,jni,ndk开发,调用fmod音频库,音效引擎库

文章目录

  • Android开发,jni,ndk开发,调用fmod音频库,音效引擎库
    • 1.fmod介绍
    • 2.cmake
    • 3.C++代码实践

Android开发,jni,ndk开发,调用fmod音频库,音效引擎库

1.fmod介绍

https://www.fmod.com/

手机cpu架构指令

在这里插入图片描述

2.cmake

作用:把fmod的代码导入到动态库中

导入头文件:

导入库文件:

    // Used to load the 'native-lib' library on application startup.static {
//        System.loadLibrary("native-lib");// libnative-lib.so 包含fmod。才能调用fmod,把fmod集成到libnative-lib.so动态库里面就可以调用了//apk lib平台libnative-lib.so里面的代码System.loadLibrary("native-lib");}

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.4.1)
#批量导入所有的cpp文件
file(GLOB allCPP *.c *.h *.cpp)#导入头文件
include_directories(inc) #相对CMakeLists的路径#导入库文件,c++环境变量
#CMAKE_SOURCE_DIR CMakeLists的路径
#CMAKE_ANDROID_ARCH 获取手机的四大平台set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -L${CMAKE_SOURCE_DIR}/../jniLibs/${CMAKE_ANDROID_ARCH_ABI}")# Creates and names a library, sets it as either STATIC
# or SHARED, and provides the relative paths to its source code.
# You can define multiple libraries, and CMake builds them for you.
# Gradle automatically packages shared libraries with your APK.add_library( # Sets the name of the library.native-lib #//libnative-lib.so的生成# Sets the library as a shared library.SHARED #//动态库# Provides a relative path to your source file(s).native-lib.cpp #//源文件${allCPP})# Searches for a specified prebuilt library and stores the path as a
# variable. Because CMake includes system libraries in the search path by
# default, you only need to specify the name of the public NDK library
# you want to add. CMake verifies that the library exists before
# completing its build.
#日志打印的库
find_library( # Sets the name of the path variable.log-lib# Specifies the name of the NDK library that# you want CMake to locate.log )# Specifies libraries CMake should link to your target library. You
# can link multiple libraries, such as libraries you define in this
# build script, prebuilt third-party libraries, or system libraries.target_link_libraries( # Specifies the target library.native-lib# Links the target library to the log library# included in the NDK.${log-lib}fmodfmodL)

链接库

在这里插入图片描述

        externalNativeBuild {cmake {
//                cppFlags ""abiFilters "armeabi-v7a"}}

只处理armeabi-v7a平台,ndk下面这个是会把so库编译进apk里

ndk{abiFilters "armeabi-v7a"
}

3.C++代码实践

资源目录

在这里插入图片描述

java代码

public class MainActivity extends AppCompatActivity {libnative-lib.so 动态库    libnative-lib.a 静态库static {// libnative-lib.so 必须包含fmod代码。我们才能调用fmodSystem.loadLibrary("native-lib");}private String path;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);path = "file:///android_asset/test.mp3";FMOD.init(this); }public void onClick(View view) {switch (view.getId()) {case R.id.btn_kongling:voiceChangeNative(MODE_KONGLING, path);break;}}private native void voiceChangeNative(int mode, String path);public native String stringFromJNI();//jni调用的一个方法private void playerEnd(String msg) {Toast.makeText(this, "" +msg, Toast.LENGTH_SHORT).show();}@Overrideprotected void onDestroy() {super.onDestroy();FMOD.close(); }}

导入头文件,可以在fmod官方库获取

hpp后缀 C++,ndk,

在这里插入图片描述

在这里插入图片描述

声音

在这里插入图片描述

Demo JNI

extern "C"
JNIEXPORT void JNICALL
Java_com_example_myapplication_MainActivity_voiceChangeNative(JNIEnv *env, jobject thiz, jint mode,jstring path) {char * testString = "结束";//c语言字符串const char *path1 = env->GetStringUTFChars(path, NULL);//fmod引擎系统指针System *system1 = nullptr;//音效指针Sound *sound = nullptr;//音轨指针Channel *channel = nullptr;//数字信号处理指针DSP *dsp = nullptr;System_Create(&system1);//初始化system1->init(20, FMOD_INIT_NORMAL, 0);//创建声音音轨system1->createSound(path1, FMOD_DEFAULT, 0, &sound);system1->playSound(sound, 0, false, &channel);switch (mode) {case com_example_myapplication_MainActivity_MODE_NORMAL:testString = "MODE_NORMAL 播放结束";break;case com_example_myapplication_MainActivity_MODE_GAOGUAI:testString = "MODE_GAOGUAI 播放结束";//音轨中获取频率float mFrequency;channel->getFrequency(&mFrequency);// 修改 帧率channel->setFrequency(mFrequency * 1.9f);break;case com_example_myapplication_MainActivity_MODE_LUOLI:testString = "MODE_LUOLI 播放完毕";//Dsp pitch,创建音调system1->createDSPByType(FMOD_DSP_TYPE_PITCHSHIFT, &dsp);//设置音调dsp->setParameterFloat(FMOD_DSP_PITCHSHIFT_PITCH, 2.0f);// 设置音效到音轨里面channel->addDSP(0, dsp);break;}//监听bool isPlay = 1;while (isPlay){channel->isPlaying(&isPlay);usleep(1000 * 1000);}//sound->release();system1->close();system1->release();env->ReleaseStringUTFChars(path, path1);//通知java层的playerEnd函数jclass mainCls = env->GetObjectClass(thiz);jmethodID endMethod = env->GetMethodID(mainCls, "playerEnd", "(Ljava/lang/String;)V");jstring value = env->NewStringUTF(testString);env->CallVoidMethod(thiz, endMethod, value);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/323400.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

zabbix监控系统

生产环境中,我们为了实现地域容灾,我们会把服务器放在不同的地域,如果一台zabbix server去监控的话,延迟会高,因为中国的网络由很多运营商在经营,包括联通,移动,电信,教育…

stable diffusion 人物高级提示词(四)朝向、画面范围、远近、焦距、机位、拍摄角度

一、朝向 英文中文front view正面Profile view / from side侧面half-front view半正面Back view背面(quarter front view:1.5)四分之一正面 prompt/英文中文翻译looking at the camera看向镜头facing the camera面对镜头turned towards the camera转向镜头looking away from …

启动 Mac 时显示闪烁的问号

启动 Mac 时显示闪烁的问号 如果启动时在 Mac 屏幕上看到闪烁的问号,这意味着你的 Mac 无法找到自身的系统软件。 如果 Mac 启动时出现闪烁的问号且无法继续启动,请尝试以下步骤。 1.通过按住其电源按钮几秒钟来关闭 Mac。 2.按一下电源按钮&#xf…

Chromedriver 下载和安装指南

1. 确定Chrome浏览器版本 首先,在谷歌浏览器中找到当前版本信息。 打开“设置”,点击“关于谷歌”即可看到版本号。确保后续下载的Chromedriver版本与Chrome浏览器版本一致。或者直接跳转网页地址:chrome://settings/help 2. 下载Chromedri…

Unity 打包AB 场景烘培信息丢失

场景打包成 AB 资源的时候,Unity 不会打包一些自带相关的资源 解决办法:在 Project settings > Graphics下设置(Automatic 修改成 Custom)

亚马逊店铺遇到账号申诉模版分享

1.表达诚意,先认错再说:我知道,最近我们在Amazon.com上作为卖家的表现已经低于亚马逊和我们自己的质量标准。 2.清楚分明的格式:我们库存管理的混乱导致了延迟发货,更糟糕的是,物品无法使用。当延迟发货和…

Python之基本数据类型

目录 一、基本数据类型总结 二、基本数据类型 Number(数字) String(字符串) Bool(布尔类型) List(列表) Tuple(元组) Set(集合&#xff09…

[C#]使用onnxruntime部署yolov8-onnx印章检测

【官方框架地址】 https://github.com/ultralytics/ultralytics.git 【算法介绍】 YOLOv8是目标检测领域中的一种先进算法,它是YOLO(You Only Look Once)系列算法的最新发展。YOLO算法以其高效和实时的性能而著名,而YOLOv8则进一…

HarmoryOS Ability页面的生命周期

接入穿山甲SDK app示例: android 数独小游戏 经典数独休闲益智 广告接入示例: Android 个人开发者如何接入广告SDK,实现app流量变现 Ability页面的生命周期 学习前端,第一步最重要的是要理解,页面启动和不同场景下的生命周期的…

STM32 CubeMX产生的程序架构

使用STM32CubeMX产生启动相关代码,配置各种外设。在后续程序开发过程中,有可能使用STM32CubeMX逐步产生使用的代码,为了将其产生的代码和我们程序隔离,一种可行的程序架构如下: 在此架构中,STM32CubeMX产生…

【数据分析实战】冰雪大世界携程景区评价信息情感分析采集词云

文章目录 引言数据采集数据集展示数据预处理 数据分析评价总体情况分析本人浅薄分析 各游客人群占比分析本人浅薄分析 各评分雷达图本人浅薄分析 差评词云-可视化本人浅薄分析 好评词云-可视化本人浅薄分析 综合分析写在最后 今年冬天,哈尔滨冰雪旅游"杀疯了&q…

微服务应用可观测性解决方案介绍

目录 一、可观测性出现背景 二、什么是可观测性(Observability) 2.1 可观测性的不同解析 2.1.1 百度维基解析 2.1.2 IBM解析 2.1.3 CNCF(云原生计算机基金会)组织解析 2.1.4 我的个人理解 2.2 可观测性和监控的区别与联系 …