android studio编译SDL so库

一、下载源码

SDL官网
在这里插入图片描述
在这里插入图片描述

二、解压,拷贝android项目,并重新命名

2.1、解压

在这里插入图片描述

2.2,重命名项目名称(androidSDL)AndroidSDL Github

在这里插入图片描述

三、导入头文件和源文件,修改android.mk文件

3.1、在jni目录下创建SDL2文件夹,并拷贝相关头文件和源文件到该目录下

在这里插入图片描述

3.2、在jni/src目录下创建.cpp文件

在这里插入图片描述
main.cpp

#include "SDL.h"
int main(int,char**){
   return 0;
}

3.3、修改jni/src下的android.mk文件

在这里插入图片描述
Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := main

SDL_PATH := ../SDL2

LOCAL_C_INCLUDES := $(LOCAL_PATH)/$(SDL_PATH)/include

# Add your application source files here...
LOCAL_SRC_FILES := main.cpp

LOCAL_SHARED_LIBRARIES := SDL2

LOCAL_LDLIBS := -lGLESv1_CM -lGLESv2 -lOpenSLES -llog -landroid

include $(BUILD_SHARED_LIBRARY)

四、使用NDK编译

4.1、环境变量path配置ndk路径

在这里插入图片描述

4.2、打开cmd命令窗口,进入到androidSDL/app/jni/目录,然后执行"ndk-build"命令进行编译

在这里插入图片描述

4.3、根目录下生成libs目录,里面会有对应的so库

在这里插入图片描述
在这里插入图片描述

五、依赖so库

5.1、创建新项目(AndroidSDLThread)Github

在这里插入图片描述

5.2、src/main创建jniLibs目录,拷贝so库

在这里插入图片描述

5.3、src/main/cpp下创建include文件夹,拷贝SDL头文件至此

在这里插入图片描述

5.4、CMakeList.txt文件下配置SDL头文件和库文件

cmake_minimum_required(VERSION 3.18.1)
project("androidsdlthread")

#SDL统一路径
set(sdl_path ${CMAKE_SOURCE_DIR}/../jniLibs/${ANDROID_ABI})
#添加SDL头文件
include_directories(${CMAKE_SOURCE_DIR}/include/SDL)
#添加SDL库
add_library(sdl SHARED IMPORTED)
set_target_properties(sdl PROPERTIES IMPORTED_LOCATION ${sdl_path}/libSDL2.so)

add_library(sdl_shared SHARED IMPORTED)
set_target_properties(sdl_shared PROPERTIES IMPORTED_LOCATION ${sdl_path}/libc++_shared.so)

add_library(sdl_main SHARED IMPORTED)
set_target_properties(sdl_main PROPERTIES IMPORTED_LOCATION ${sdl_path}/libmain.so)

add_library(
        androidsdlthread
        SHARED
        native-lib.cpp
        ${CMAKE_SOURCE_DIR}/logger.h)
find_library(
        log-lib
        log)
target_link_libraries( # Specifies the target library.
        androidsdlthread
        sdl
        sdl_shared
        sdl_main
        -landroid
        ${log-lib})

在这里插入图片描述

六、使用SDL信号量,实现等待通知机制

SDL(Simple DirectMedia Layer)库提供了信号量(semaphore)的支持,用于实现线程间的同步和通信。信号量是一种计数器,用于控制对共享资源的访问,可以实现多线程之间的同步和互斥,确保线程安全和资源的正确访问。

  • 创建信号量:调用SDL_CreateSemaphore() 函数创建一个信号量对象。在底层,SDL库会调用操作系统提供的原生信号量创建函数,如sem_init()(Linux)或CreateSemaphore()(Windows)。
  • 等待信号量:调用SDL_SemWait() 或类似的函数等待信号量。在底层,SDL库会调用操作系统提供的原生信号量等待函数,如sem_wait()(Linux)或WaitForSingleObject()(Windows)。如果信号量的计数值大于0,则将计数值减1,线程可以继续执行。如果计数值为0,则线程会被阻塞,直到有其他线程调用SDL_SemPost()增加了信号量的计数值。
  • 发送通知:调用SDL_SemPost() 函数增加信号量的计数值。在底层,SDL库会调用操作系统提供的原生信号量增加函数,如sem_post()(Linux)或ReleaseSemaphore()(Windows)。增加计数值后,如果有线程正在等待该信号量其中一个线程将被唤醒,可以继续执行。
  • 销毁信号量:调用SDL_DestroySemaphore() 函数销毁信号量对象。在底层,SDL库会调用操作系统提供的原生信号量销毁函数,如sem_destroy()(Linux)或CloseHandle()(Windows)。

6.1、声明native方法

    public native void startSDLThread();

    public native void postSDL();

    public native void releaseSDL();

6.2、生成jni函数

#include <jni.h>
#include <string>

extern "C" {
#include <SDL_thread.h>
#include "logger.h"

SDL_sem *g_sem = NULL;
int g_task_exit = 0;
int task1(void *data);
int task2(void *data);
int number=0;

JNIEXPORT void JNICALL
Java_com_anniljing_androidsdlthread_MainActivity_startSDLThread(JNIEnv *env, jobject thiz) {
    g_task_exit=0;
    g_sem = SDL_CreateSemaphore(0);
    SDL_CreateThread(task1, "task1", NULL);
    SDL_CreateThread(task2, "task2", NULL);
}
JNIEXPORT void JNICALL
Java_com_anniljing_androidsdlthread_MainActivity_postSDL(JNIEnv *env, jobject thiz) {
    if (g_sem) {
        SDL_SemPost(g_sem);
    }
}

JNIEXPORT void JNICALL
Java_com_anniljing_androidsdlthread_MainActivity_releaseSDL(JNIEnv *env, jobject thiz) {
    g_task_exit = 1;
    SDL_DestroySemaphore(g_sem);
    g_sem = NULL;
}
int task1(void *data) {
    while (!g_task_exit) {
        if (g_sem) {
            LOGD("task1 SemWait");
            SDL_SemWait(g_sem);
            number++;
            LOGD("task1 number:%d\n",number);
        }
    }
    return 0;
}
int task2(void *data) {
    while (!g_task_exit) {
        if (g_sem) {
            LOGD("task2 SemWait");
            SDL_SemWait(g_sem);
            number++;
            LOGD("task2 number:%d\n",number);
        }
    }
    return 0;
}
}


6.3、编译运行

在这里插入图片描述
在这里插入图片描述
我们需要把这个文件夹拷贝到自己的项目
在这里插入图片描述
在这里插入图片描述

  • 启动了两个线程
  • 虽然线程2被唤起的次数多一些,但是当线程1执行的时候,变量number也是同步的

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

腾讯云服务器可用区是什么意思?

腾讯云服务器可用区是什么意思&#xff1f;云服务器可用区如何选择&#xff1f;可用区是指在同一个地域内电力和网络相互独立的区域&#xff0c;可用区可以做到故障隔离&#xff0c;所以可用区存在的意义在于构建高可用、高容灾应用&#xff0c;将应用部署在不同可用区内&#…

爬虫基础之爬虫的基本介绍

一、爬虫概述 爬虫又称网络蜘蛛、网络机器人&#xff0c;网络爬虫按照系统结构和实现技术&#xff0c;大致可以分为以下几种类型&#xff1a; 通用网络爬虫&#xff08;Scalable Web Crawler&#xff09;&#xff1a;抓取互联网上所有数据&#xff0c;爬取对象从一些种子 URL…

腾讯云服务器可用区是什么意思?可用区选择方法

腾讯云服务器可用区是什么意思&#xff1f;云服务器可用区如何选择&#xff1f;可用区是指在同一个地域内电力和网络相互独立的区域&#xff0c;可用区可以做到故障隔离&#xff0c;所以可用区存在的意义在于构建高可用、高容灾应用&#xff0c;将应用部署在不同可用区内&#…

【2024全新版】程序员必会英语词汇表

“我英语不好可以学编程吗&#xff1f;” 相信这个问题&#xff0c;困扰着太多想学习编程&#xff0c;但英文不好的同学。 学习编程&#xff0c;常用的单词就那么多&#xff0c;只要把常见的单词学会&#xff0c;你的代码就能写的很6&#xff0c;英 语和编程的关系就是这么纯…

市场研究报告:量子计算将颠覆银行业!

&#xff08;图片来源&#xff1a;网络&#xff09; 量子银行将对金融体系产生重大影响&#xff0c;它在量子计算和区块链的基础上建立了一个更快的支付机制&#xff0c;并且通过消除传统点对点支付中常见的中间人&#xff0c;降低了运营成本。 量子计算及其运作机制 中东地区…

利用ffmpeg实现rtmp和rtsp推流

环境说明 windows11 : ffmpeg VLC Linux Unbuntu20.04 : SRS MediaMTX 可选&#xff1a;GStreamer win11下载ffmpeg和ffplay ffmpeg官网 添加环境变量&#xff1a;添加ffmpeg/bin所在的路径。 D:\ffmpeg\ffmpeg-master-latest-win64-lgpl-shared\bin win11查看本机电脑的设备…

JRebel

JRebel 下载&#xff1a; 1.在idea 直接下载 但版本不好控制 2.仓库下载地址&#xff1a;https://plugins.jetbrains.com/plugin/4441-jrebel-and-xrebel/versions/stable 注意版本&#xff1a;2022 .4.1 激活&#xff1a; 打开地址&#xff1a;https://jrebel.qekang.com/ …

英伟达真是赢麻了,深夜推出最强AI芯片霸场 | 百能云芯

10月14日凌晨&#xff0c;英伟达在2023年全球超算大会&#xff08;Supercomputing Conference&#xff0c;SC&#xff09;上正式宣布&#xff0c;升级旗舰AI芯片&#xff0c;推出全新的H200芯片&#xff0c;以处理更强大的人工智能系统。包括亚马逊的AWS、Alphabet的Google Clo…

CDP体系化建设1-CDP综述

前言 从CRM到DMP&#xff0c;再到CDP的横空出世&#xff0c;数据产品领域推陈出新的速度也挺快的。 而了解CDP的人可能会说&#xff0c;CDP和BI一样&#xff0c;糅杂了太多东西&#xff0c;都不知道如何概括。 在我看来&#xff0c;CDP也是一个看似简单&#xff0c;但是需要借助…

MYSQL存储引擎和索引

存储引擎 InnoDB&#xff08;默认&#xff09; 存储引擎的对比 MYISAM被MangoDB替代了 MEMORY被Redis替代了 索引 是一种高效获取数据的数据结构 索引结构 二叉树&#xff0c;红黑树&#xff08;都不合适&#xff09; B树 插入超过5个数&#xff0c;会从中间分裂 B树 …

Qt高级--(2)自定义标题栏

自定义标题栏 功能点 1.标题栏中最外层布局器使用水平布局器。 2.导航按钮、工具按钮和窗口功能按钮都是用水平布局器&#xff0c;边距和间隔可根据实际情况设置。 3.编写 QSS 样式&#xff0c;并将样式设置到窗口控件中。 4.实现最小化、最大化和关闭窗口按钮功能。 5.实现鼠…

可信联邦学习冬令营·成都开营,产学研共促AI人才培养

近年来&#xff0c;国家对于人工智能和数据安全的重视程度不断加强。国务院《新一代人工智能发展规划》中明确提出了加强人工智能领域的基础研究、培养高素质人才、促进产业融合等方面的要求。联邦学习是人工智能和隐私计算核心技术之一&#xff0c;以“数据不动模型动&#xf…

Tomcat web.xml文件中的mime-mapping

在Tomcat安装目录的conf/web.xml文件中&#xff0c;定义了大量的<mime-mapping>元素&#xff0c;例如&#xff1a; 其中<extension>指定了文件的扩展名&#xff0c;<mime-type>指定了mime类型&#xff0c;放在<mime-mapping>元素中&#xff0c;就是将…

APIcloud 【现已更名 用友开发中心】 iOS发版 应用程序请求用户同意访问相机和照片,但没有在目的字符串中充分说明相机和照片的使用。

iOS 审核时 提示 首次安装软件 获取相机 相册 提示信息 怎么修改 我们注意到你的应用程序请求用户同意访问相机和照片&#xff0c;但没有在目的字符串中充分说明相机和照片的使用。 为了解决这个问题&#xff0c;修改应用信息中的目的字符串是合适的。相机和照片的Plist文件&a…

layui表头多出一列(已解决)

问题描述 &#xff1a;layui表头多出来一列&#xff0c;但是表体没有内容&#xff0c;很影响美观。 好像是原本的表格有滚轮&#xff0c;我操作放大之后滚轮没有了&#xff0c;但是滚轮自带的表头样式还在&#xff0c; 之后手动把这个样式隐藏掉了&#xff0c;代码如下&#xf…

iceoryx(冰羚)-简介

概要 RouDi RouDi是Routing and Discovery的缩写。RouDi负责通信设置&#xff0c;但实际上并不参与发布者与订阅者或客户端与服务器之间的通信。鲁迪可以被认为是iceoryx的总机操作员。它的另一个主要任务是设置共享内存&#xff0c;应用程序使用共享内存交换有效负载数据。Ro…

操作系统(五)文件系统和I/O系统

文章目录 前言文件系统文件系统和文件文件描述符目录、文件别名和文件系统分层文件系统目录实现文件别名名字解析&#xff08;路径遍历&#xff09;文件系统挂载文件系统种类 虚拟文件系统文件缓存和打开文件打开文件 文件分配空闲空间管理和冗余磁盘阵列RAID空闲空间管理冗余磁…

JJJ:python学习笔记

p4 没有编译的过程 源码和输入得到输出 静态语言&#xff1a;编译型 脚本语言&#xff1a;解释型 p5 又叫做胶水语言 p7 p8 p10

RHCE8 资料整理(六)

RHCE8 资料整理 第 6 篇 软件管理第 23 章 用rpm管理软件23.1 rpm查询23.2 rpm卸载23.3 软件包升级23.4 rpm验证 第 24 章 用yum/dnf管理软件包24.1 yum架构介绍24.2 用光盘搭建yum源24.3 创建私有仓库24.4 yum客户端配置24.5 yum基本使用24.5.1 查询24.5.2 安装与卸载24.5.3 下…

Navicat Premium 16,无限重置试用14天

打开注册表编辑器 红箭头所指方向每个系统判别不一样 如何判别呢&#xff1f;一个个点开看底下是不是info&#xff0c;如果是那么把info文件夹删掉就可以了。