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

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

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.zip
    distributionUrl=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/app
    build.gradle            - 构建信息,包括应用程序版本和SDK
    src/main/AndroidManifest.xml    - 包清单。其中包含主Activity的类名和应用程序的包名等信息。
    jni/                    - 存放原生代码的目录
    jni/Application.mk      - 应用程序JNI设置,包括目标平台和STL库
    jni/Android.mk          - 可递归调用所有子目录中Android.mk文件的Android makefile
    jni/CMakeLists.txt      - 顶级CMake项目,将SDL作为子项目添加
    jni/SDL/                - (指向)存放SDL库文件的目录
    jni/SDL/Android.mk      - 创建SDL共享库的Android makefile
    jni/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.kler.cn/a/508446.html

相关文章:

  • Python毕业设计选题:基于django+vue的智能租房系统的设计与实现
  • Transformer创新模型!Transformer+BO-SVR多变量回归预测,添加气泡图、散点密度图(Matlab)
  • Json转换类型报错问题:java.lang.Integer cannot be cast to java.math.BigDecimal
  • 【git】如何删除本地分支和远程分支?
  • [0242-07].第09节:SpringBoot中简单功能分析
  • 如何在谷歌浏览器中设置自定义安全警告
  • 数字经济时代下的创新探索与实践:以“开源AI智能名片2+1链动模式S2B2C商城小程序源码”为核心
  • Python基础04(函数)
  • Java UML 类图绘制解析:结构与工具类型详解
  • 淘宝、京东联盟数字ID转加密ID接口
  • CentOS 安装Redis
  • 机器学习之SVD奇异值分解实现图片降维
  • MySQL 数据库 :SQL 语句规约(不得使用外键与级联,一切外键概念必须在应用层解决。)
  • 无人机技术架构剖析!
  • 半导体、芯片、人工智能、智能驾驶汽车的趋势
  • ansible基础
  • 【OpenCV(C++)快速入门】--opencv学习
  • LTX-Video 高效视频生成模型,一键处理图片文字
  • Swift语言的软件开发工具
  • [SUCTF2018]babyre
  • 基于SpringBoot+Vue的药品管理系统【源码+文档+部署讲解】
  • 记一次linux下的c++ arm程序调试
  • c语言中单引号和双引号用法详解
  • cmake foreach 条件判断
  • SpringBoot Starter 通用接口加密组件(防篡改)+ RequestBodyAdvice和ResponseBodyAdvice原理
  • 商用车电子电气零部件电磁兼容条件和试验(8)—辐射抗干扰(ALSE)和便携式发射机抗干扰(HPT)