源码分析简介

本文详细分析了Android系统中蓝牙扫描的入口、JNI层与Java层的交互,包括蓝牙扫描的启动过程、设备查询流程以及消息传递机制。在JNI层,通过start_discovery()函数调用协议栈进行设备扫描,扫描到的设备信息通过Java层的回调函数传递。文章还探讨了Bluedroid的初始化流程,重点关注bluetooth.default.so库、bluetoothInterface接口的获取以及蓝牙打开过程。
摘要由CSDN通过智能技术生成


二、蓝牙扫描入口分析

    1、JNI层调用开始扫描函数:(jni/com_android_bluetooth_btservice_adaptservice.cpp)中startDiscoveryNative()
    上面函数又调用协议栈(btif/src)中bluetooth.c文件中的start_discovery();(开始扫描函数接口,在这层中函数实现)
    
    2、(jni/com_android_bluetooth_btservice_adaptservice.cpp) classinitnative()函数用来:
        JNI层从Java层获取回调函数,并从bluetooth.default.so中获取操作接口函数。
        其中:Jni从Java层获取蓝牙扫描状态变化的回调函数:method_discoveryStateChangeCallback
        (apps/bluetooth/src/com/android/bluetooth/btservice/AdapterProperties.java)
        其中:Jni从Java层获取的蓝牙设备的通知回调函数:method_deviceFoundCallback
        (apps/bluetooth/src/com/android/bluetooth/btservice/RemoteDevices.java)
        获取蓝牙操作接口btStack->get_bluetooth_interface();如:enable();disable();等
        ***蓝牙接口函数位置为:协议栈(btif/src)中bluetooth.c
    
    3、在AdapterService.java初始化时,调用initnative()函数,725行,进行前期初始化。    
        //alps/vendor/mediatek/proprietary/packages/apps/Bluetooth/src/com/android/bluetooth/btservice/AdapterService.java
        initnative()   
            |该函数实现在jni/com_android_bluetooth_btservice_AdapterService.cpp中,689行。
            |此函数中:
                     调用协议栈的init()函数接口,//bluetooth.c 136行 向协议栈注册回调函数集合。当协议栈发生
            状态变化和有消息需要通知上层时,会调用相应的注册回调函数。
            |
      注册回调函数集合(jni/com_android_bluetooth_btservice_adaptservice.cpp) sBluetoothCallback();        
        
    4、当协议栈扫描到设备时会调用:device_found_callback(); //jni/com_android_bluetooth_btservice_AdapterService.cpp
        这个函数中最后一句:CallbackEnv->CallVoidMethod();
        中method_deviceFoundCallback 是调用java层(apps/bluetooth/src/com/android/bluetooth/btservice/RemoteDevices.java)
        的deviceFoundCallback()函数;
    
    总结:在JNI层中调用扫描函数(此函数在协议栈中),start_discovery()进行设备扫描,
        扫描到的设备状态变化和获取到的蓝牙设备的通知,
        调用java层discoveryStateChangeCallback()和deviceFoundCallback()函数 来实现。
三、蓝牙扫描流程的启动过程
    1、入口扫描函数(start_discovery)执行,主要是配置扫描参数,并发消息告诉BT DM search模块参数和启动扫描过程。
        start_discovery(扫描入口) btif/src/bluetooth.c
            |
            |调用btif_dm.c文件中的扫描接口;
            |
        btif_dm_start_discovery()主要是配置扫描参数(btif api functions (no context switch))
            函数实现:清除遗留在索引0上的任何东西、(我们需要同时处理多个查询问题)在索引0上添加 允许所有的过滤器、ble的扫描过滤配置、
                    发消息给BTA DM 模块进行 配置存储,扫描模式为BR/EDR,BLE全扫,inquiry时间为10秒等等。
            |
            |调用bta/dm/bta_dm_api.c中的文件
            |
        BTA_DmSearch()
            此函数搜索对等蓝牙设备。它执行查询并获取设备的远程名称。
            如果服务不为零,则执行服务发现
            |
      

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值