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

相关文章

C#如何调用C++库

《C#如何调用C++库》:本文主要介绍C#如何调用C++库方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录方法一:使用P/Invoke1. 导出C++函数2. 定义P/Invoke签名3. 调用C++函数方法二:使用C++/CLI作为桥接1. 创建C++/CL

Android使用ImageView.ScaleType实现图片的缩放与裁剪功能

《Android使用ImageView.ScaleType实现图片的缩放与裁剪功能》ImageView是最常用的控件之一,它用于展示各种类型的图片,为了能够根据需求调整图片的显示效果,Android提... 目录什么是 ImageView.ScaleType?FIT_XYFIT_STARTFIT_CENTE

Go语言开发实现查询IP信息的MCP服务器

《Go语言开发实现查询IP信息的MCP服务器》随着MCP的快速普及和广泛应用,MCP服务器也层出不穷,本文将详细介绍如何在Go语言中使用go-mcp库来开发一个查询IP信息的MCP... 目录前言mcp-ip-geo 服务器目录结构说明查询 IP 信息功能实现工具实现工具管理查询单个 IP 信息工具的实现服

Android实现在线预览office文档的示例详解

《Android实现在线预览office文档的示例详解》在移动端展示在线Office文档(如Word、Excel、PPT)是一项常见需求,这篇文章为大家重点介绍了两种方案的实现方法,希望对大家有一定的... 目录一、项目概述二、相关技术知识三、实现思路3.1 方案一:WebView + Office Onl

Android实现两台手机屏幕共享和远程控制功能

《Android实现两台手机屏幕共享和远程控制功能》在远程协助、在线教学、技术支持等多种场景下,实时获得另一部移动设备的屏幕画面,并对其进行操作,具有极高的应用价值,本项目旨在实现两台Android手... 目录一、项目概述二、相关知识2.1 MediaProjection API2.2 Socket 网络

Android实现悬浮按钮功能

《Android实现悬浮按钮功能》在很多场景中,我们希望在应用或系统任意界面上都能看到一个小的“悬浮按钮”(FloatingButton),用来快速启动工具、展示未读信息或快捷操作,所以本文给大家介绍... 目录一、项目概述二、相关技术知识三、实现思路四、整合代码4.1 Java 代码(MainActivi

Android Mainline基础简介

《AndroidMainline基础简介》AndroidMainline是通过模块化更新Android核心组件的框架,可能提高安全性,本文给大家介绍AndroidMainline基础简介,感兴趣的朋... 目录关键要点什么是 android Mainline?Android Mainline 的工作原理关键

如何解决idea的Module:‘:app‘platform‘android-32‘not found.问题

《如何解决idea的Module:‘:app‘platform‘android-32‘notfound.问题》:本文主要介绍如何解决idea的Module:‘:app‘platform‘andr... 目录idea的Module:‘:app‘pwww.chinasem.cnlatform‘android-32

使用Python开发一个带EPUB转换功能的Markdown编辑器

《使用Python开发一个带EPUB转换功能的Markdown编辑器》Markdown因其简单易用和强大的格式支持,成为了写作者、开发者及内容创作者的首选格式,本文将通过Python开发一个Markd... 目录应用概览代码结构与核心组件1. 初始化与布局 (__init__)2. 工具栏 (setup_t

Android实现打开本地pdf文件的两种方式

《Android实现打开本地pdf文件的两种方式》在现代应用中,PDF格式因其跨平台、稳定性好、展示内容一致等特点,在Android平台上,如何高效地打开本地PDF文件,不仅关系到用户体验,也直接影响... 目录一、项目概述二、相关知识2.1 PDF文件基本概述2.2 android 文件访问与存储权限2.