[Android源码解析]Eventloop在jni层的分析

2024-06-20 21:32

本文主要是介绍[Android源码解析]Eventloop在jni层的分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

3 eventloopjni层的详细分析

         Eventloop在整个bluetoothjni层和bluez之间的交互,以及jniframework层之间的交互过程中有着举足轻重的作用。所以,本文仍然需要花费一定的笔墨来分析它,当然由于它更像是一个桥梁,我们的分析有可能就不是那么的深入了,会从比较宏观地角度来看待这个东西的作用。

         当然,一切的一切还是要从源码来说:

static jboolean startEventLoopNative(JNIEnv *env, jobject object) {jboolean result = JNI_FALSE;
#ifdef HAVE_BLUETOOTHevent_loop_native_data_t *nat = get_native_data(env, object);pthread_mutex_lock(&(nat->thread_mutex));//这个是用来判断eventloop是否启动的nat->running = false;if (nat->pollData) {LOGW("trying to start EventLoop a second time!");pthread_mutex_unlock( &(nat->thread_mutex) );return JNI_FALSE;}//申请pollfanat->pollData = (struct pollfd *)malloc(sizeof(struct pollfd) *DEFAULT_INITIAL_POLLFD_COUNT);if (!nat->pollData) {LOGE("out of memory error starting EventLoop!");goto done;}//申请dbus的watch datanat->watchData = (DBusWatch **)malloc(sizeof(DBusWatch *) *DEFAULT_INITIAL_POLLFD_COUNT);if (!nat->watchData) {LOGE("out of memory error starting EventLoop!");goto done;}//初始化为0memset(nat->pollData, 0, sizeof(struct pollfd) *DEFAULT_INITIAL_POLLFD_COUNT);memset(nat->watchData, 0, sizeof(DBusWatch *) *DEFAULT_INITIAL_POLLFD_COUNT);//datasize和member count的初始化nat->pollDataSize = DEFAULT_INITIAL_POLLFD_COUNT;nat->pollMemberCount = 1;//申请socket 对,保存到controlFdRif (socketpair(AF_LOCAL, SOCK_STREAM, 0, &(nat->controlFdR))) {LOGE("Error getting BT control socket");goto done;}//data 0是其中一个,可以猜到了是通过socket在内部通信的nat->pollData[0].fd = nat->controlFdR;nat->pollData[0].events = POLLIN;env->GetJavaVM( &(nat->vm) );nat->envVer = env->GetVersion();nat->me = env->NewGlobalRef(object);//建立eventloop,详细分析见3.1if (setUpEventLoop(nat) != JNI_TRUE) {LOGE("failure setting up Event Loop!");goto done;}//建立eventloopmain的thread,他肯定就是在不停地运行了&#

这篇关于[Android源码解析]Eventloop在jni层的分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1079311

相关文章

Android 悬浮窗开发示例((动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

《Android悬浮窗开发示例((动态权限请求|前台服务和通知|悬浮窗创建)》本文介绍了Android悬浮窗的实现效果,包括动态权限请求、前台服务和通知的使用,悬浮窗权限需要动态申请并引导... 目录一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后

Springboot中分析SQL性能的两种方式详解

《Springboot中分析SQL性能的两种方式详解》文章介绍了SQL性能分析的两种方式:MyBatis-Plus性能分析插件和p6spy框架,MyBatis-Plus插件配置简单,适用于开发和测试环... 目录SQL性能分析的两种方式:功能介绍实现方式:实现步骤:SQL性能分析的两种方式:功能介绍记录

Android里面的Service种类以及启动方式

《Android里面的Service种类以及启动方式》Android中的Service分为前台服务和后台服务,前台服务需要亮身份牌并显示通知,后台服务则有启动方式选择,包括startService和b... 目录一句话总结:一、Service 的两种类型:1. 前台服务(必须亮身份牌)2. 后台服务(偷偷干

最长公共子序列问题的深度分析与Java实现方式

《最长公共子序列问题的深度分析与Java实现方式》本文详细介绍了最长公共子序列(LCS)问题,包括其概念、暴力解法、动态规划解法,并提供了Java代码实现,暴力解法虽然简单,但在大数据处理中效率较低,... 目录最长公共子序列问题概述问题理解与示例分析暴力解法思路与示例代码动态规划解法DP 表的构建与意义动

C语言中自动与强制转换全解析

《C语言中自动与强制转换全解析》在编写C程序时,类型转换是确保数据正确性和一致性的关键环节,无论是隐式转换还是显式转换,都各有特点和应用场景,本文将详细探讨C语言中的类型转换机制,帮助您更好地理解并在... 目录类型转换的重要性自动类型转换(隐式转换)强制类型转换(显式转换)常见错误与注意事项总结与建议类型

MySQL 缓存机制与架构解析(最新推荐)

《MySQL缓存机制与架构解析(最新推荐)》本文详细介绍了MySQL的缓存机制和整体架构,包括一级缓存(InnoDBBufferPool)和二级缓存(QueryCache),文章还探讨了SQL... 目录一、mysql缓存机制概述二、MySQL整体架构三、SQL查询执行全流程四、MySQL 8.0为何移除查

在Rust中要用Struct和Enum组织数据的原因解析

《在Rust中要用Struct和Enum组织数据的原因解析》在Rust中,Struct和Enum是组织数据的核心工具,Struct用于将相关字段封装为单一实体,便于管理和扩展,Enum用于明确定义所有... 目录为什么在Rust中要用Struct和Enum组织数据?一、使用struct组织数据:将相关字段绑

使用Java实现一个解析CURL脚本小工具

《使用Java实现一个解析CURL脚本小工具》文章介绍了如何使用Java实现一个解析CURL脚本的工具,该工具可以将CURL脚本中的Header解析为KVMap结构,获取URL路径、请求类型,解析UR... 目录使用示例实现原理具体实现CurlParserUtilCurlEntityICurlHandler

C#使用DeepSeek API实现自然语言处理,文本分类和情感分析

《C#使用DeepSeekAPI实现自然语言处理,文本分类和情感分析》在C#中使用DeepSeekAPI可以实现多种功能,例如自然语言处理、文本分类、情感分析等,本文主要为大家介绍了具体实现步骤,... 目录准备工作文本生成文本分类问答系统代码生成翻译功能文本摘要文本校对图像描述生成总结在C#中使用Deep

深入解析Spring TransactionTemplate 高级用法(示例代码)

《深入解析SpringTransactionTemplate高级用法(示例代码)》TransactionTemplate是Spring框架中一个强大的工具,它允许开发者以编程方式控制事务,通过... 目录1. TransactionTemplate 的核心概念2. 核心接口和类3. TransactionT