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 := mainSDL_PATH := ../SDL2LOCAL_C_INCLUDES := $(LOCAL_PATH)/$(SDL_PATH)/include# Add your application source files here...
LOCAL_SRC_FILES := main.cppLOCAL_SHARED_LIBRARIES := SDL2LOCAL_LDLIBS := -lGLESv1_CM -lGLESv2 -lOpenSLES -llog -landroidinclude $(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(androidsdlthreadSHAREDnative-lib.cpp${CMAKE_SOURCE_DIR}/logger.h)
find_library(log-liblog)
target_link_libraries( # Specifies the target library.androidsdlthreadsdlsdl_sharedsdl_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也是同步的

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

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

相关文章

亚马逊云科技云存储服务指南

文章作者&#xff1a;Libai 高效的云存储服务对于现代软件开发中的数据管理至关重要。亚马逊云科技云存储服务提供了强大的工具&#xff0c;可以简化工作流程并增强数据管理能力。 亚马逊云科技开发者社区为开发者们提供全球的开发技术资源。这里有技术文档、开发案例、技术专栏…

在前端开发中,什么是CDN(Content Delivery Network)?它的作用是什么?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

【RH850芯片】RH850U2A芯片平台Spinlock的底层实现

目录 前言 正文 1.RH850U2A上的原子操作 1.1 Link 1.2 Link generation 1.3 Success in storing 1.4 Failure in storing 1.5 Condition for successful storing 1.6 Loss of the link 1.7 示例代码 2.Spinlock代码分析 2.1 尝试获取Spinlock 2.2 释放Spinlock …

基于PyTorch搭建你的生成对抗性网络

前言 你听说过GANs吗&#xff1f;还是你才刚刚开始学&#xff1f;GANs是2014年由蒙特利尔大学的学生 Ian Goodfellow 博士首次提出的。GANs最常见的例子是生成图像。有一个网站包含了不存在的人的面孔&#xff0c;便是一个常见的GANs应用示例。也是我们将要在本文中进行分享的…

Spring Boot中使用MongoDB完成数据存储

我们在开发中用到的数据存储工具有许多种&#xff0c;我们常见的数据存储工具包括&#xff1a; 关系性数据库&#xff1a;使用表格来存储数据&#xff0c;支持事务和索引。&#xff08;如&#xff1a;MySQL&#xff0c;Oracle&#xff0c;SQL Server等&#xff09;。NoSQL数据…

Redis篇---第七篇

系列文章目录 文章目录 系列文章目录前言一、是否使用过 Redis Cluster 集群,集群的原理是什么?二、 Redis Cluster 集群方案什么情况下会导致整个集群不可用?三、Redis 集群架构模式有哪几种?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分…

OPPO Watch纯手机开启远程ADB调试

Wear OS手表中&#xff0c;我们可以直接在开发者设置中打开WiFi调试。但是这在OPPO等魔改Android系统中不再奏效。 需要什么&#xff1f;&#xff1f; 手表一台手机一个OTG转接头一个手表充电器一个 演示设备 手机&#xff1a; OPPO Find X手表&#xff1a; OPPO Watch 1代 …

Android——模块级build.gradle配置——applicationId和namespace

官方地址&#xff1a; 配置应用模块-applicationId和namespace了解 build.gradle 中的实用设置。https://developer.android.google.cn/studio/build/configure-app-module?hlzh-cn 产生那些异常场景&#xff1a; Android&#xff1a;Namespace not specified. Please spec…

Halcon (3):窗体常用语法使用

文章目录 文章专栏视频资源前言halcon图像使用加载图片示例绘制常用图像批量批注绘制 文章专栏 Halcon开发 视频资源 机器视觉之C#联合Halcon 前言 在使用halcon的算子之前&#xff0c;我们要先学会如何在图片上面进行标注。因为我们不仅要导出处理的结果&#xff0c;还要导出…

论文阅读:YOLOV: Making Still Image Object Detectors Great at Video Object Detection

发表时间&#xff1a;2023年3月5日 论文地址&#xff1a;https://arxiv.org/abs/2208.09686 项目地址&#xff1a;https://github.com/YuHengsss/YOLOV 视频物体检测&#xff08;VID&#xff09;具有挑战性&#xff0c;因为物体外观的高度变化以及一些帧的不同恶化。有利的信息…

Windows10电脑没有微软商店的解决方法

在Windows10电脑中用户可以打开微软商店&#xff0c;下载自己需要的应用程序。但是&#xff0c;有用户反映自己Windows10电脑上没有微软商店&#xff0c;但是不清楚具体的解决方法&#xff0c;接下来小编给大家详细介绍关于解决Windows10电脑内微软商店不见了的方法&#xff0c…

计算机的发展

硬件的发展 第一台电子数字计算机&#xff1a;ENIAC&#xff08;1946&#xff09;&#xff0c;作者&#xff1a;冯诺依曼&#xff0c;逻辑元件&#xff1a;电子管 bug&#xff1a;小虫子&#xff0c;会影响打点 Intel&#xff1a; 机器字长&#xff1a;计算机一次整数运算所能…

springcloudalibaba-3

一、Nacos Config入门 1. 搭建nacos环境【使用现有的nacos环境即可】 使用之前的即可 2. 在微服务中引入nacos的依赖 <!-- nacos配置依赖 --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-…

深入Rust:探索所有权和借用机制

大家好&#xff01;我是lincyang。 今天&#xff0c;我们将一起深入探索Rust语言中的一个核心概念&#xff1a;所有权和借用机制。 这些特性是Rust区别于其他语言的重要特点&#xff0c;它们在内存管理和并发编程中扮演着关键角色。 一、Rust所有权机制 1. 什么是所有权&#x…

Qt HTTP 摘要认证(海康球机摄像机ISAPI开发)

接到一个需求是开发下海康的球机,控制云台,给到我的是一个开发手册,当然了是海康的私有协议 ISAPI开发手册https://download.csdn.net/download/qq_37059136/88547425关于开发这块读文档就可以理解了,海康使用的是摘要认证,当然了海康已经给出使用范例 通过libcurl就可以直接连…

C/C++---------------LeetCode第1189. “气球” 的最大数量

气球的最大数量 题目及要求统计法在main内使用 题目及要求 给你一个字符串 text&#xff0c;你需要使用 text 中的字母来拼凑尽可能多的单词 “balloon”&#xff08;气球&#xff09;。 字符串 text 中的每个字母最多只能被使用一次。请你返回最多可以拼凑出多少个单词 “ba…

Openssl X509 v3 AuthorityKeyIdentifier实验与逻辑分析

Openssl是X509的事实标准&#xff0c;目前主流OS或个别安全性要求较高的设计场景&#xff0c;对X509的证书链验证已经不在停留在只从数字签名校验了&#xff0c;也就是仅仅从公钥验签的角度&#xff0c;在这些场景中&#xff0c;往往还会校验AuthorityKeyIdentifier和SubjectKe…

Egress-TLS-Origination

目录 文章目录 目录本节实战1、出口网关TLS发起2、通过 egress 网关发起双向 TLS 连接关于我最后 本节实战 实战名称&#x1f6a9; 实战&#xff1a;Egress TLS Origination-2023.11.19(failed)&#x1f6a9; 实战&#xff1a;通过 egress 网关发起双向 TLS 连接-2023.11.19(测…

STM32_SPI总线驱动OLED详细原理讲解

目录 这里写目录标题 第13章 Cortex-M4-SPI总线13.1 SPI总线概述13.1.1 SPI总线介绍13.1.2 SPI总线接口与物理拓扑结构13.1.3 SPI总线通信原理13.1.4 SPI总线数据格式 13.2 IO口模拟SPI操作OLED13.2.1 常见的显示设备13.2.2 OLED显示屏概述13.2.3 OLED特征13.2.4 显示原理13.2.…