1. packet中的jni,调用协议栈的过程
a.定义
在./hardware/libhardware/include/hardware/bluetooth.h中
b.jni中
在./packages/apps/Bluetooth/jni/com_android_bluetooth_btservice_AdapterService.cp中
c. 协议栈中
在./external/bluetooth/bluedroid/btif/src/bluetooth.c中
c.1 jni调用协议栈的open函数
module->methods->open(module, id, &abstraction); //调用libbluedroid.so的open函数
c.2 jni调用协议栈的get_bluetooth_interface函数
bluetooth_module_t* btStack = (bluetooth_module_t *)abstraction;
sBluetoothInterface = btStack->get_bluetooth_interface();
在./external/bluetooth/bluedroid/btif/src/bluetooth.c中
返回了 Bluetooth DM interface的结构体 这样jni就可以调用蓝牙的打开,关闭,discovery的接口了。
a.定义
在./hardware/libhardware/include/hardware/bluetooth.h中
-
#define BT_HARDWARE_MODULE_ID "bluetooth"
- #define BT_STACK_MODULE_ID "bluetooth"
在./packages/apps/Bluetooth/jni/com_android_bluetooth_btservice_AdapterService.cp中
-
static void classInitNative(JNIEnv* env, jclass
clazz) {
-
const char *id = (strcmp(value, "1")? BT_STACK_MODULE_ID : BT_STACK_TEST_MODULE_ID);
-
hw_get_module(id, (hw_module_t const**)&module); //获取动态库libbluedroid.so的入口
-
hw_device_t* abstraction;
-
module->methods->open(module, id, &abstraction);
//调用libbluedroid.so的open函数
-
bluetooth_module_t* btStack = (bluetooth_module_t *)abstraction;
-
sBluetoothInterface = btStack->get_bluetooth_interface();
- }
在./external/bluetooth/bluedroid/btif/src/bluetooth.c中
-
static struct hw_module_methods_t bt_stack_module_methods = {
-
.open = open_bluetooth_stack,
-
};
-
-
struct hw_module_t HAL_MODULE_INFO_SYM = {
-
.tag = HARDWARE_MODULE_TAG,
-
.version_major = 1,
-
.version_minor = 0,
-
.id = BT_HARDWARE_MODULE_ID, //通过这个id找到对应的库
-
.name = "Bluetooth Stack",
-
.author = "The Android Open Source Project",
-
.methods = &bt_stack_module_methods
- };
module->methods->open(module, id, &abstraction); //调用libbluedroid.so的open函数
-
static int open_bluetooth_stack (const struct
hw_module_t* module, char const* name,
-
struct hw_device_t** abstraction)
-
{
-
bluetooth_device_t *stack = malloc(sizeof(bluetooth_device_t) );
-
memset(stack, 0, sizeof(bluetooth_device_t) );
-
stack->common.tag = HARDWARE_DEVICE_TAG;
-
stack->common.version = 0;
-
stack->common.module = (struct
hw_module_t*)module;
-
stack->common.close = close_bluetooth_stack;
-
stack->get_bluetooth_interface = bluetooth__get_bluetooth_interface;
-
*abstraction = (struct hw_device_t*)stack;
-
return 0;
- }
bluetooth_module_t* btStack = (bluetooth_module_t *)abstraction;
sBluetoothInterface = btStack->get_bluetooth_interface();
在./external/bluetooth/bluedroid/btif/src/bluetooth.c中
-
const bt_interface_t* bluetooth__get_bluetooth_interface ()
-
{
-
return &bluetoothInterface;
- }