网站首页 > 技术文章 正文
蓝牙协议栈初始化流程分析
熟悉安卓系统中蓝牙基本架构的同学想必对蓝牙协议栈不会陌生,还不了解的也不必担心,出门左转查看我另一篇文章《安卓系统中蓝牙服务层的初始化流程分析》,那篇分析里有一幅蓝牙系统在安卓中的架构图,想来对初识蓝牙的小伙伴会有很大帮助。
蓝牙协议栈整体上分为:HOST + Controller,它们之间以HCI为界线形象地分为上下两部分。Controller对应蓝牙固件也就是蓝牙芯片,这块协议的实现和各家厂商的策略差异很大,但依赖的协议都是相同的。而Host部分最为核心的就是协议栈,本篇分析我们就来扒一扒安卓系统中蓝牙协议栈初始化的实现流程,大家坐稳,出发了。
协议栈源码路径:\system\bt\
从该仓库下的相关编译配置文件可以知道,协议栈模块最终会被编译成动态so库的形式供其他模块调用。相关配置路径为:system\bt\main\ Android.bp(安卓8之前为Android.mk)
上面的架构图可以明显看出协议栈的动态so库是被JNI层加载的,JNI使用系统提供的动态so库加载方法实现获取协议栈so库对应的句柄即内存地址,再从打开的so库中查找对应的函数地址,这样JNI就达到调用协议栈中函数的目的。我们先来看下协议栈的初始化时序图:
再简单对上面的时序图做如下几点分析:
- 蓝牙JNI层通过dlopen()的系统调用根据蓝牙协议栈动态库名libbluetooth.so获取到该库对应的句柄,相当于文件描述符吧。
- 再通过dlsym()查找到bluetoothInterface对应的HAL函数接口,即内存地址。
- 通过获取到的函数接口初始化协议栈,主要设置了一组回调函数,同时协议栈主要创建了两个重要的子线程:stack_manager,bt_jni_workqueue,上述时序图里黄颜色标注。
通过以上三步,协议栈的初始化大概就完成了。本篇分析就到这儿,对蓝牙技术感兴趣的小伙伴欢迎私信留言一起讨论。
猜你喜欢
- 2024-10-27 NDK开发——FFmpeg视频解码 ffmpeg ndk
- 2024-10-27 Camera基本代码架构 camera calibrator
- 2024-10-27 android 功耗分析方法和优化(1) 功耗app
- 2024-10-27 Cocos Creator v2.3.2 发布了!全新 Launcher 效率飞起!
- 2024-10-27 如何androd动态注册编写计算器 淘宝动态评分计算器在线
- 2024-10-27 高通平台OV8856 Camera的bring up总结
- 2024-10-27 高通平台移植GC2145 Camera驱动 高通驱动安装
- 2024-10-27 《坎公骑冠剑》光炮Android Mk.99技能与背景故事
- 2024-10-27 ubuntu移植libwebp到Android平台 ubuntu移植到arm
- 2024-10-27 步步为营,十分钟学会 Native JNI(附带彩蛋)
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)