当前位置: 首页 > news >正文

SDL2:Android APP编译使用

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 项目文件说明


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库依赖于这个实现。你应该为你的应用程序继承这个类。

.


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

相关文章:

SDL2:Android APP编译使用

SDL2&#xff1a;Android APP编译使用 3. SDL2&#xff1a;Android APP编译使用3.1 Android Studio环境准备&#xff1a;3.2 构建Android APP&#xff08;1&#xff09;方式一&#xff1a;快速构建APK工程&#xff08;2&#xff09;方式二&#xff1a;自定义APK工程&#xff08…...

linux systemd 服务连续启动失败,不会再重启分析

1. 问题现象 在Linux 系统中&#xff0c;将自已写的可执行文件放到 systemd 服务中做成service 服务&#xff0c;以支持开机自启和失败重启。但是发现服务在重启多次失败后再也起不来&#xff0c;服务状态是 failed&#xff0c;并且报 start request repeated too quickly. 2.…...

【云岚到家】-day03-门户缓存方案选择

【云岚到家】-day03-门户缓存方案选择 1.门户常用的技术方案 什么是门户 说到门户马上会想到门户网站&#xff0c;中国比较早的门户网站有新浪、网易、搜狐、腾讯等&#xff0c;门户网站为用户提供一个集中的、易于访问的平台&#xff0c;使他们能够方便地获取各种信息和服务…...

在IDEA中使用通义灵码插件:全面提升开发效率的智能助手

在IDEA中使用通义灵码插件&#xff1a;全面提升开发效率的智能助手 随着软件开发行业对效率和质量要求的不断提高&#xff0c;开发者们一直在寻找能够简化工作流程、提升代码质量的工具。阿里云推出的通义灵码插件正是这样一个旨在帮助开发者更高效地编写高质量代码的强大工具…...

【正则表达式】从0开始学习正则表达式

正则表达式&#xff08;英语&#xff1a;Regular Expression&#xff0c;在代码中常简写为regex、regexp或RE&#xff09; 一、推荐学习网站 正则表达式 – 语法 | 菜鸟教程 正则表达式30分钟入门教程 | 菜鸟教程 编程胶囊-打造学习编程的最好系统 二、必知必记 2.1 元字符…...

PHP智慧小区物业管理小程序

&#x1f31f;智慧小区物业管理小程序&#xff1a;重塑社区生活&#xff0c;开启便捷高效新篇章 &#x1f31f; 智慧小区物业管理小程序是一款基于PHPUniApp精心雕琢的智慧小区物业管理小程序&#xff0c;它犹如一股清新的科技之风&#xff0c;吹进了现代智慧小区的每一个角落…...

Linux安装Docker教程(详解)

如果想要系统学习docker,建议进入官方文档中学习&#xff1a;docker官方文档 一. 基本概念 Docker Desktop 和 Docker Engine 有什么区别&#xff1f; Docker Desktop for Linux 提供用户友好的图形界面&#xff0c;可简化容器和服务的管理。它包括 Docker Engine&#xff0c…...

开源AI微调指南:入门级简单训练,初探AI之路

112&#xff0c;如何让 113&#xff1f; 简单的微调你的 AI&#xff0c; 微调前的效果&#xff0c;怎么调教它都是 112. 要对其进行微调&#xff08;比如训练113&#xff09;&#xff0c;可以按以下步骤进行。 确保你已经安装了以下工具和库&#xff1a; ollamallama3.2Pyt…...

Leetcode 91. 解码方法 动态规划

原题链接&#xff1a;Leetcode 91. 解码方法 自己写的代码&#xff1a; class Solution { public:int numDecodings(string s) {int ns.size();vector<int> dp(n,1);if(s[n-1]0) dp[n-1]0;for(int in-2;i>0;i--){if(s[i]!0){string ts.substr(i,2);int tmpatoi(t.c…...

ASP .NET Core 学习(.NET9)配置接口访问路由

新创建的 ASP .NET Core Web API项目中Controller进行请求时&#xff0c;是在地址:端口/Controller名称进行访问的&#xff0c;这个时候Controller的默认路由配置如下 访问接口时&#xff0c;是通过请求方法&#xff08;GET、Post、Put、Delete&#xff09;进行接口区分的&…...

将 AzureBlob 的日志通过 Azure Event Hubs 发给 Elasticsearch(2 换掉付费的Event Hubs)

前情回顾&#xff1a; 将 AzureBlob 的日志通过 Azure Event Hubs 发给 Elasticsearch&#xff08;1&#xff09;-CSDN博客 前边的方案是挺好的&#xff0c;但 Azure Event Hubs 是付费服务&#xff0c;我这里只是一个获取日志进行必要的分析&#xff0c;并且不要求实时性&am…...

idea 如何安装 github copilot

idea 如何安装 github copilot 要在 IntelliJ IDEA 中安装 GitHub Copilot&#xff0c;可以按照以下步骤操作&#xff1a; 打开 IntelliJ IDEA: 启动 IntelliJ IDEA。 打开插件管理器: 点击菜单栏中的 File。 选择 Settings&#xff08;Windows/Linux&#xff09;或 Prefere…...

1.17学习

crypto nssctf-[SWPUCTF 2021 新生赛]crypto8 不太认识这是什么编码&#xff0c;搜索一下发现是一个UUENCODE编码&#xff0c;用在线工具UUENCODE解码计算器—LZL在线工具解码就好 misc buuctf-文件中的秘密 下载附件打开后发现是一个图片&#xff0c;应该是一个图片隐写&…...

Redis系列之底层数据结构整数集IntSet

Redis系列之底层数据结构整数集IntSet 什么是IntSet IntSet&#xff0c;整数集合&#xff0c;是Redis集合类型的一种底层数据结构&#xff0c;当一个集合只包含整数值元素&#xff0c;并且这个集合的元素数量不多时&#xff0c;redis就会选用intset作为底层实现。 IntSet的数…...

外包公司名单一览表(成都)

大家好&#xff0c;我是苍何。 之前写了一篇武汉的外包公司名单&#xff0c;评论区做了个简单统计&#xff0c;很多人说&#xff0c;在外包的日子很煎熬&#xff0c;不再想去了。 有小伙伴留言说有些外包会强制离职&#xff0c;不行就转岗&#xff0c;让人极度没有安全感。 这…...

个人vue3-学习笔记

声明:这只是我个人的学习笔记(黑马),供以后复习用 。一天学一点,随时学随时更新。明天会更好的! 这里只给代码,不给运行结果,看不出来代码的作用我也该进厂了。。。。。 Day1 使用create-vue创建项目。 1.检查版本。 node -v 2.创建项目 npm init vue@latest 可…...

STM32 FreeRTOS消息队列

队列简介 队列是任务间通信的主要形式。 它们可以用于在任务之间以及中断和任务之间发送消息。 队列是线程安全的数据结构&#xff0c;任务可以通过队列在彼此之间传递数据。有以下关键特点&#xff1a; FIFO顺序&#xff1a;队列采用先进先出 (FIFO) 的顺序&#xff0c;即先…...

Datawhale-self-llm-Phi-4 Langchain接入教程

本项目是一个围绕开源大模型、针对国内初学者、基于 AutoDL 平台的中国宝宝专属大模型教程&#xff0c;针对各类开源大模型提供包括环境配置、本地部署、高效微调等技能在内的全流程指导&#xff0c;简化开源大模型的部署、使用和应用流程&#xff0c;让更多的普通学生、研究者…...

窥探QCC518x/308x系列与手机之间的蓝牙HCI记录与分析 - 手机篇

今天要介绍给大家的是, 当我们在开发高通耳机时如果遇到与手机之间相容性问题, 通常会用Frontline或Ellisys的Bluetooth Analyzer来截取资料分析, 如果手边没有这样的仪器, 要如何窥探Bluetooth的HCI log.这次介绍的是手机篇. 这次跟QCC518x/QCC308x测试的手机是Samsung S23 U…...

Golang Gin系列-1:Gin 框架总体概述

本文介绍了Gin框架&#xff0c;探索了它的关键特性&#xff0c;并建立了简单入门的应用程序。在这系列教程里&#xff0c;我们会探索Gin的主要特性&#xff0c;如路由、中间件、数据库集成等&#xff0c;最终能使用Gin框架构建健壮的web应用程序。 总体概述 Gin是Go编程语言的…...

uniapp 对接腾讯云IM群组成员管理(增删改查)

UniApp 实战&#xff1a;腾讯云IM群组成员管理&#xff08;增删改查&#xff09; 一、前言 在社交类App开发中&#xff0c;群组成员管理是核心功能之一。本文将基于UniApp框架&#xff0c;结合腾讯云IM SDK&#xff0c;详细讲解如何实现群组成员的增删改查全流程。 权限校验…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

测试微信模版消息推送

进入“开发接口管理”--“公众平台测试账号”&#xff0c;无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息&#xff1a; 关注测试号&#xff1a;扫二维码关注测试号。 发送模版消息&#xff1a; import requests da…...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘

美国西海岸的夏天&#xff0c;再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至&#xff0c;这不仅是开发者的盛宴&#xff0c;更是全球数亿苹果用户翘首以盼的科技春晚。今年&#xff0c;苹果依旧为我们带来了全家桶式的系统更新&#xff0c;包括 iOS 26、iPadOS 26…...

模型参数、模型存储精度、参数与显存

模型参数量衡量单位 M&#xff1a;百万&#xff08;Million&#xff09; B&#xff1a;十亿&#xff08;Billion&#xff09; 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的&#xff0c;但是一个参数所表示多少字节不一定&#xff0c;需要看这个参数以什么…...

ssc377d修改flash分区大小

1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)

CSI-2 协议详细解析 (一&#xff09; 1. CSI-2层定义&#xff08;CSI-2 Layer Definitions&#xff09; 分层结构 &#xff1a;CSI-2协议分为6层&#xff1a; 物理层&#xff08;PHY Layer&#xff09; &#xff1a; 定义电气特性、时钟机制和传输介质&#xff08;导线&#…...

CMake基础:构建流程详解

目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

五年级数学知识边界总结思考-下册

目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解&#xff1a;由来、作用与意义**一、知识点核心内容****二、知识点的由来&#xff1a;从生活实践到数学抽象****三、知识的作用&#xff1a;解决实际问题的工具****四、学习的意义&#xff1a;培养核心素养…...

什么是Ansible Jinja2

理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具&#xff0c;可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板&#xff0c;允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板&#xff0c;并通…...