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

2024-01-05 13:36

本文主要是介绍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);
}

这篇关于Android开发,jni,ndk开发,调用fmod音频库,音效引擎库的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/573028

相关文章

Android kotlin中 Channel 和 Flow 的区别和选择使用场景分析

《Androidkotlin中Channel和Flow的区别和选择使用场景分析》Kotlin协程中,Flow是冷数据流,按需触发,适合响应式数据处理;Channel是热数据流,持续发送,支持... 目录一、基本概念界定FlowChannel二、核心特性对比数据生产触发条件生产与消费的关系背压处理机制生命周期

Android ClassLoader加载机制详解

《AndroidClassLoader加载机制详解》Android的ClassLoader负责加载.dex文件,基于双亲委派模型,支持热修复和插件化,需注意类冲突、内存泄漏和兼容性问题,本文给大家介... 目录一、ClassLoader概述1.1 类加载的基本概念1.2 android与Java Class

Java中调用数据库存储过程的示例代码

《Java中调用数据库存储过程的示例代码》本文介绍Java通过JDBC调用数据库存储过程的方法,涵盖参数类型、执行步骤及数据库差异,需注意异常处理与资源管理,以优化性能并实现复杂业务逻辑,感兴趣的朋友... 目录一、存储过程概述二、Java调用存储过程的基本javascript步骤三、Java调用存储过程示

MySQL之InnoDB存储引擎中的索引用法及说明

《MySQL之InnoDB存储引擎中的索引用法及说明》:本文主要介绍MySQL之InnoDB存储引擎中的索引用法及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录1、背景2、准备3、正篇【1】存储用户记录的数据页【2】存储目录项记录的数据页【3】聚簇索引【4】二

SQLite3 在嵌入式C环境中存储音频/视频文件的最优方案

《SQLite3在嵌入式C环境中存储音频/视频文件的最优方案》本文探讨了SQLite3在嵌入式C环境中存储音视频文件的优化方案,推荐采用文件路径存储结合元数据管理,兼顾效率与资源限制,小文件可使用B... 目录SQLite3 在嵌入式C环境中存储音频/视频文件的专业方案一、存储策略选择1. 直接存储 vs

Python中Tensorflow无法调用GPU问题的解决方法

《Python中Tensorflow无法调用GPU问题的解决方法》文章详解如何解决TensorFlow在Windows无法识别GPU的问题,需降级至2.10版本,安装匹配CUDA11.2和cuDNN... 当用以下代码查看GPU数量时,gpuspython返回的是一个空列表,说明tensorflow没有找到

SpringBoot开发中十大常见陷阱深度解析与避坑指南

《SpringBoot开发中十大常见陷阱深度解析与避坑指南》在SpringBoot的开发过程中,即使是经验丰富的开发者也难免会遇到各种棘手的问题,本文将针对SpringBoot开发中十大常见的“坑... 目录引言一、配置总出错?是不是同时用了.properties和.yml?二、换个位置配置就失效?搞清楚加

SpringBoot集成LiteFlow工作流引擎的完整指南

《SpringBoot集成LiteFlow工作流引擎的完整指南》LiteFlow作为一款国产轻量级规则引擎/流程引擎,以其零学习成本、高可扩展性和极致性能成为微服务架构下的理想选择,本文将详细讲解Sp... 目录一、LiteFlow核心优势二、SpringBoot集成实战三、高级特性应用1. 异步并行执行2

python如何调用java的jar包

《python如何调用java的jar包》这篇文章主要为大家详细介绍了python如何调用java的jar包,文中的示例代码简洁易懂,具有一定的借鉴价值,有需要的小伙伴可以参考一下... 目录一、安装包二、使用步骤三、代码演示四、自己写一个jar包五、打包步骤六、方法补充一、安装包pip3 install

Android DataBinding 与 MVVM使用详解

《AndroidDataBinding与MVVM使用详解》本文介绍AndroidDataBinding库,其通过绑定UI组件与数据源实现自动更新,支持双向绑定和逻辑运算,减少模板代码,结合MV... 目录一、DataBinding 核心概念二、配置与基础使用1. 启用 DataBinding 2. 基础布局