SDL2:Android APP编译使用 -- SDL2多媒体库使用音频实例


更多内容:XiaoJ的知识星球


SDL2:Android APP编译使用

    • 3. SDL2:Android APP编译使用
      • 3.1 Android Studio环境准备:
      • 3.2 构建Android APP
        • (1)方式一:快速构建APK工程
        • (2)方式二:自定义APK工程
        • (3)方式三:CMake构建APK工程
      • 3.3 android-project 项目文件说明


SDL2(Simple DirectMedia Layer 2)是一个开源的跨平台多媒体开发库,它提供了一套简洁高效的API,用于处理图形渲染、音频播放、输入设备管理等功能,帮助开发者轻松创建出能在多种操作系统上运行的多媒体应用程序。

3. SDL2:Android APP编译使用

参考:https://github.com/mayzelf/SDL2/blob/release-2.28.4/docs/README-android.md

3.1 Android Studio环境准备:

(1)安装JDK、Android Studio

(2)安装Android SDK、Android NDK

export AS_DIR=$MY_ENV_HOME/App/Android_Studio/android-studio-2022.1.1.19
export ANDROID_HOME=$MY_ENV_HOME/App/Android_Studio/Android-2022.1.1.19
export ANDROID_NDK_HOME=$ANDROID_HOME/Sdk/ndk/28.0.12674087
export PATH=$PATH:$AS_DIR

3.2 构建Android APP

先下载SDL2源代码,SDL2官方网站下载或以下方式:

wget https://www.libsdl.org/release/SDL2-2.28.4.tar.gz
tar -zxvf SDL2-2.28.4.tar.gz
mv  SDL2-2.28.4   /home/SDL

有以下方式,构建不同程度需求的APK:

(1)方式一:快速构建APK工程
cd /home/SDL 
cd build-scripts
./androidbuild.sh org.libsdl.testgles ../test/testgles.c
# 或
# ./androidbuild.sh org.libsdl.audio ../test/*audio*# 输出
To build and install to a device for testing, run the following:
cd /home/SDL/build/org.libsdl.testgles
./gradlew installDebug
(2)方式二:自定义APK工程

1.将 SDL/android-project 目录复制并重命名,如YOURPROJECT

2.将 SDL 目录移动或符号链接到 YOURPROJECT/app/jni目录。

3.编辑YOURPROJECT/app/jni/src/Android.mk以包含您的源文件:

  • 它们应该在 LOCAL_SRC_FILES := 声明后用空格分隔

4a.如想用 Android Studio,只需打开您的YOURPROJECT目录并开始构建。

4b. 如要手动构建,在项目目录运行 ./gradlew installDebug

  • 它将在任何连接的 Android 设备上构建和安装您的 .apk

实际操作如下:

# 构建工程目录
cp -rf  SDL/android-project/  YOURPROJECT
cp -rf  SDL  YOURPROJECT/app/jni/SDL# APK工程相应修改# (1) 替换源和gradle版本:# 打开YOURPROJECT/gradle/wrapper/gradle-wrapper.properties#distributionUrl=https\://services.gradle.org/distributions/gradle-8.1.1-bin.zipdistributionUrl=https\://mirrors.cloud.tencent.com/gradle/gradle-7.5-bin.zip# 打开YOURPROJECT/build.gradle// classpath 'com.android.tools.build:gradle:8.1.1'classpath 'com.android.tools.build:gradle:7.4.0'# (2) 添加音频权限声明: 在AndroidManifest.xml中添加<uses-permission android:name="android.permission.RECORD_AUDIO"/># (3) 生成源文件:YOURPROJECT/app/jni/src/*.cpp(例如testSDL2.cpp, 代码详情附在下面)# 在YOURPROJECT/app/jni/src/Android.mk中,“LOCAL_SRC_FILES := ” 声明*.cpp后用空格分隔# 编译运行apk# 方式一:用 Android Studio构建# 方式二:运行 ./gradlew installDebug
#include "SDL.h"#include <stdlib.h>
#include <stdio.h>static SDL_AudioSpec spec;
static SDL_AudioDeviceID devid_in = 0;
static SDL_AudioDeviceID devid_out = 0;static void
audio_callback(void *userdata, Uint8 *stream, int len)
{// 这里可以添加音频处理逻辑SDL_Log("标志:音频回调函数被调用,数据长度 = %d\n", len);
}int main(int argc, char **argv)
{SDL_AudioSpec wanted;int devcount;int i;/* 启用标准应用程序日志 */SDL_LogSetPriority(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO);/* 加载SDL库 */if (SDL_Init(SDL_INIT_AUDIO) < 0) {SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "标志:无法初始化SDL: %s\n", SDL_GetError());return 1;}SDL_Log("标志:使用的音频驱动: %s\n", SDL_GetCurrentAudioDriver());devcount = SDL_GetNumAudioDevices(SDL_TRUE);for (i = 0; i < devcount; i++) {SDL_Log("标志:捕获设备 #%d: '%s'\n", i, SDL_GetAudioDeviceName(i, SDL_TRUE));}SDL_zero(wanted);wanted.freq = 44100;  // 采样率wanted.format = AUDIO_S16SYS;  // 格式wanted.channels = 1;  // 通道数wanted.samples = 1024;  // 样本数wanted.callback = audio_callback;SDL_zero(spec);/* 打开默认播放设备 */SDL_Log("标志:打开默认播放设备...\n");devid_out = SDL_OpenAudioDevice(NULL, SDL_FALSE, &wanted, &spec, SDL_AUDIO_ALLOW_ANY_CHANGE);if (!devid_out) {SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "标志:无法打开音频播放设备: %s!\n", SDL_GetError());SDL_Quit();exit(1);}/* 打开默认捕获设备 */SDL_Log("标志:打开默认捕获设备...\n");// devid_in = SDL_OpenAudioDevice(NULL, SDL_TRUE, &spec, &spec, 0);devid_in = SDL_OpenAudioDevice(SDL_GetAudioDeviceName(0, SDL_TRUE), SDL_TRUE, &spec, &spec, 0);if (!devid_in) {SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "标志:无法打开音频捕获设备: %s!\n", SDL_GetError());SDL_Quit();exit(1);}SDL_Log("标志:音频设备成功打开!\n");/* 启动音频播放和捕获 */SDL_PauseAudioDevice(devid_out, 0);SDL_PauseAudioDevice(devid_in, 0);SDL_Log("标志:音频播放和捕获已启动。按回车键停止。\n");/* 等待用户输入停止 */getchar();/* 停止音频播放和捕获 */SDL_PauseAudioDevice(devid_out, 1);SDL_PauseAudioDevice(devid_in, 1);SDL_Log("标志:关闭音频设备。\n");/* 关闭音频设备 */SDL_CloseAudioDevice(devid_out);SDL_CloseAudioDevice(devid_in);/* 退出SDL库 */SDL_Quit();return 0;
}
(3)方式三:CMake构建APK工程

1.将 SDL/android-project 目录复制并重命名,如YOURPROJECT

2.将 SDL 目录移动或符号链接到 YOURPROJECT/app/jni目录。

3.编辑YOURPROJECT/app/build.gradle:注掉 ndk-build 的部分,取消注释 cmake 部分。向CMake调用添加参数。

4.编辑YOURPROJECT/app/jni/CMakeLists.txt以包含您的项目(默认添加src子目录):

  • 请注意,您的项目中将 SDL2、SDL2main 和 SDL2-static 作为目标,因此您的 CMakeLists.txt 文件中应该有target_link_libraries(yourgame SDL2 SDL2main)

  • 另请注意,对包含main函数的目标,应使用add_library()而不是add_executable()

5a. 如想用 Android Studio,只需打开您的YOURPROJECT目录并开始构建。

6b. 如要手动构建,在项目目录运行 ./gradlew installDebug

  • 它将在任何连接的 Android 设备上构建和安装您的 .apk

3.3 android-project 项目文件说明

android-project/appbuild.gradle            - 构建信息,包括应用程序版本和SDKsrc/main/AndroidManifest.xml    - 包清单。其中包含主Activity的类名和应用程序的包名等信息。jni/                    - 存放原生代码的目录jni/Application.mk      - 应用程序JNI设置,包括目标平台和STL库jni/Android.mk          - 可递归调用所有子目录中Android.mk文件的Android makefilejni/CMakeLists.txt      - 顶级CMake项目,将SDL作为子项目添加jni/SDL/                - (指向)存放SDL库文件的目录jni/SDL/Android.mk      - 创建SDL共享库的Android makefilejni/src/                - 存放C/C++源代码的目录jni/src/Android.mk      - 你应该定制的Android makefile,用于包含源代码和任何库引用jni/src/CMakeLists.txt  - 你可以定制的CMake文件,用于包含源代码和任何库引用src/main/assets/        - 存放应用程序资产文件的目录src/main/res/           - 存放应用程序资源的目录src/main/res/mipmap-*   - 存放不同手机硬件图标文件的目录src/main/res/values/strings.xml - 应用程序中使用的字符串,包括应用程序名称src/main/java/org/libsdl/app/SDLActivity.java - 处理SDL初始化和绑定的Java类。要非常小心地修改这个类,因为SDL库依赖于这个实现。你应该为你的应用程序继承这个类。

.


声明:资源可能存在第三方来源,若有侵权请联系删除!

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

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

相关文章

macOS 安装JDK17

文章目录 前言介绍新特性下载安装1.下载完成后打开downloads 双击进行安装2.配置环境变量3.测试快速切换JDK 小结 前言 近期找开源软件&#xff0c;发现很多都已经使用JDK17springboot3 了&#xff0c;之前的JDK8已经被替换下场&#xff0c;所以今天就在本机安装了JDK17&#…

重温STM32之环境安装

缩写 CMSIS&#xff1a;common microcontroller software interface standard 1&#xff0c;keil mdk安装 链接 Keil Product Downloads 安装好后&#xff0c;开始安装平台软件支持包&#xff08;keil 5后不在默认支持所有的平台软件开发包&#xff0c;需要自行下载&#…

vue3+ts+uniapp 微信小程序(第一篇)—— 微信小程序定位授权,位置信息权限授权

文章目录 简介一、先看效果1.1 授权定位前&#xff0c;先弹出隐私协议弹框1.2 上述弹框点击同意&#xff0c;得到如下弹框1.3 点击三个点&#xff0c;然后点设置 1.4 在1.2步骤下&#xff0c;无论同意或者拒绝 二、manifest.json 文件配置三、微信公众平台配置3.1 登录进入微信…

迅为RK3568开发板篇OpenHarmony实操HDF驱动控制LED-编写内核 LED HDF 驱动程序

接下来编译 LED 驱动&#xff0c;该驱动用于在基于华为设备框架&#xff08;HDF&#xff09;的系统中控制 LED 灯的开关&#xff0c;完整代码如下所示&#xff1a; 更多内容可以关注&#xff1a;迅为RK3568开发板篇OpenHarmony

AUTOSAR从入门到精通-无人驾驶网约车(Robotaxi)

目录 前言 几个高频面试题目 特斯拉的Robotaxi和萝卜快跑对比 ▍1. 技术基础与实现 ▍2. 定价 ▍3. 外观设计 算法原理 什么是Robotaxi? Robotaxi与自动驾驶的关系 定义自动驾驶及其分级(0级到5级) Robotaxi在自动驾驶技术中的应用和定位 1 Robotaxi的内涵与优势…

kafka集群安装Raft 协议

​使用消息中间件&#xff0c;可以实现系统与系统之间的异步通信和无缝对接&#xff0c;也可用在模块之间的的异步通信&#xff0c;有效避免了同步阻塞IO。作为一个高吞吐量、可扩展、高可靠性的分布式消息系统&#xff0c;Kafka 能够胜任从简单的消息队列到复杂的流处理平台的…

Java 接口安全指南

Java 接口安全指南 概述 在现代 Web 应用中&#xff0c;接口&#xff08;API&#xff09;是前后端交互的核心。然而&#xff0c;接口的安全性常常被忽视&#xff0c;导致数据泄露、未授权访问等安全问题。本文将详细介绍 Java 中如何保障接口安全&#xff0c;涵盖以下内容&am…

华为AI培训-NLP实验

中文分词、命名实体识别、语义词性标注、语句逻辑推理、文本摘要、机器翻译、文本情感分析、内容创作 1 实验介绍 1.1 实验背景 中文分词、命名实体识别、语义词性标注、语句逻辑推理是自然语言处理领域中的重要任务。中文分词是将连续的汉字序列切分成有意义的词语序列…

Flask学习入门笔记

Flask学习入门笔记 前言1. 安装Flask2. 创建一个简单的Flask应用3. 路由与视图函数3.1 基本路由3.2 动态路由3.3 HTTP方法 4. 请求与响应4.1 获取请求数据4.2 返回响应 5. 模板渲染5.1 基本模板渲染5.2 模板继承 6. 静态文件6.1 静态文件的目录结构6.2 在模板中引用静态文件6.2…

citrix netscaler13.1 重写负载均衡响应头(基础版)

在 Citrix NetScaler 13.1 中&#xff0c;Rewrite Actions 用于对负载均衡响应进行修改&#xff0c;包括替换、删除和插入 HTTP 响应头。这些操作可以通过自定义策略来完成&#xff0c;帮助你根据需求调整请求内容。以下是三种常见的操作&#xff1a; 1. Replace (替换响应头)…

【Web】2025西湖论剑·中国杭州网络安全安全技能大赛题解(全)

目录 Rank-l Rank-U sqli or not Rank-l username存在报错回显&#xff0c;发现可以打SSTI 本地起一个服务&#xff0c;折半查找fuzz黑名单&#xff0c;不断扔给fenjing去迭代改payload from flask import Flask, request, render_template_stringapp Flask(__name__)app…

【C】PAT 1011-1015

1011 AB和C 给定区间 [−231,231] 内的 3 个整数 A、B 和 C&#xff0c;请判断 AB 是否大于 C。 输入格式&#xff1a; 输入第 1 行给出正整数 T (≤10)&#xff0c;是测试用例的个数。随后给出 T 组测试用例&#xff0c;每组占一行&#xff0c;顺序给出 A、B 和 C。整数间以…

WEB渗透技术研究与安全防御

目录 作品简介I IntroductionII 1 网络面临的主要威胁1 1.1 技术安全1 2 分析Web渗透技术2 2.1 Web渗透技术的概念2 2.2 Web漏洞产生的原因2 2.3 注入测试3 2.3.1 注入测试的攻击流程3 2.3.2 进行一次完整的Sql注入测试4 2.3.3 Cookie注入攻击11 3 安全防御方案设计…

软考高级5个资格、中级常考4个资格简介及难易程度排序

一、软考高级5个资格 01、网络规划设计师 资格简介&#xff1a;网络规划设计师要求考生具备全面的网络规划、设计、部署和管理能力&#xff1b;该资格考试适合那些在网络规划和设计方面具有较好理论基础和较丰富从业经验的人员参加。 02、系统分析师 资格简介&#xff1a;系统分…

Centos 宝塔安装

yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh 安装成功界面 宝塔说明文档 https://www.bt.cn/admin/servers#wcu 或者可以注册宝塔账号 1 快速部署 安装docker 之后 2 需要在usr/bin下下载do…

ubuntu下安装编译cmake,grpc与protobuf

文章目录 install cmakeinstall grpcinstall protobuf注 install cmake sudo apt-get install -y g make libssl-devcd third_party/cmake-3.17.2./configuresudo make && make installcmake --version install grpc $ sudo apt-get install -y build-essential auto…

Java锁 从乐观锁和悲观锁开始讲 面试复盘

目录 面试复盘 Java 中的锁 大全 悲观锁 专业解释 自我理解 乐观锁 专业解释 自我理解 悲观锁的调用 乐观锁的调用 synchronized和 ReentrantLock的区别 相同点 区别 详细对比 总结 面试复盘 Java 中的锁 大全 悲观锁 专业解释 适合写操作多的场景 先加锁可以…

二十三种设计模式-装饰器模式

一、定义与核心思想 装饰器模式是一种结构型设计模式&#xff0c;其核心思想是动态地给一个对象添加一些额外的职责。通过这种方式&#xff0c;可以在不改变原有对象结构的基础上&#xff0c;灵活地增加新的功能&#xff0c;使得对象的行为可以得到扩展&#xff0c;同时又保持…

使用nginx搭建通用的图片代理服务器,支持http/https/重定向式图片地址

从http切换至https 许多不同ip的图片地址需要统一进行代理 部分图片地址是重定向地址 nginx配置 主站地址&#xff1a;https://192.168.123.100/ 主站nginx配置 server {listen 443 ssl;server_name localhost;#ssl证书ssl_certificate ../ssl/ca.crt; #私钥文件ssl_ce…

2.1.1 常用ST编程工具介绍

在工业自动化领域,ST语言(Structured Text)是IEC 61131-3标准中的一种重要编程语言。为了高效地编写、调试和运行ST程序,开发者通常依赖于一些专业的编程工具。以下是阿凡为大家介绍的几种常用的ST编程工具及其特点: 1. Codesys 概述 全称:Controller Development Syste…