android 4.2后的BT协议由原来的bluze更换成了brodcom的协议,代码路径:
external/bluetooth/bluedroid/
该协议与android framework层是通过JNI来相互调用
android的大部份BT协议或功能都在Bluetooth.apk中实现
源码路径:packages/apps/Bluetooth
JNI的也在此实现,源文件是:
jni/com_android_bluetooth_btservice_AdapterService.cpp
同时该协议需要用户实现一个bt_vendor_interface_t接口
const bt_vendor_interface_t BLUETOOTH_VENDOR_LIB_INTERFACE = {
sizeof(bt_vendor_interface_t),
bt_vnd_init,
bt_vnd_op,
bt_vnd_cleanup,
};
libbt-vendor.so在协议初始化时被加载
external/bluetooth/bluedroid/hci/src/bt_hw.c
void init_vnd_if(unsigned char *local_bdaddr) { void *dlhandle; dlhandle = dlopen("libbt-vendor.so", RTLD_NOW); bt_vnd_if = (bt_vendor_interface_t *) dlsym(dlhandle, "BLUETOOTH_VENDOR_LIB_INTERFACE"); bt_vnd_if->init(&vnd_callbacks, local_bdaddr); }
我们可以由上看到,在bt_vendor_interface_t 初始化时实际上传入了一个参数 vnd_callbacks,其实在bt_vendor_interface_t最终还是通过vnd_callbacks来操作设备。
从external/bluetooth/bluedroid/hci/src/bt_hw.c中发现vnd_callbacks中所定义的接口进一步调用的接口有bt_hc_cbacks与p_hci_if,这两种接口都在
external/bluetooth/bluedroid/hci/src/bt_hci_bdroid.c中定义