frameworks/base/core/jni/android_server_BluetoothService.cpp
static jint enableNative(JNIEnv *env, jobject object) {
#ifdef HAVE_BLUETOOTH
LOGV("%s", __FUNCTION__);
return bt_enable();
#endif
#ifdef __BTMTK__
native_data_t *nat = get_native_data(env, object);
LOGI("[GAP][API] enableNative");
if(nat)
{
nat->state = BTMTK_POWER_STATE_TURNING_ON;
if (btmtk_gap_power_on(nat))
{
btmtk_gap_init(env, object);
btmtk_hdp_init(env, object);
nat->state = BTMTK_POWER_STATE_ON;
return 0;
}
else
{
nat->state = BTMTK_POWER_STATE_OFF;
return -1;
}
}
#endif
return -1;
}
./system/bluetooth/bluedroid/bluetooth.c
int bt_enable() {
LOGV(__FUNCTION__);
int ret = -1;
int hci_sock = -1;
int attempt;
#ifdef RDA_BT_SUPPORT
sleep(4);
#endif
if (set_bluetooth_power(1) < 0) goto out;
LOGI("Starting hciattach daemon");
if (property_set("ctl.start", "hciattach") < 0) {
LOGE("Failed to start hciattach");
set_bluetooth_power(0);
goto out;
}
// Try for 10 seconds, this can only succeed once hciattach has sent the
// firmware and then turned on hci device via HCIUARTSETPROTO ioctl
for (attempt = 1000; attempt > 0; attempt--) {
hci_sock = create_hci_sock();
if (hci_sock < 0) goto out;
ret = ioctl(hci_sock, HCIDEVUP, HCI_DEV_ID);
LOGI("bt_enable: ret: %d, errno: %d", ret, errno);
if (!ret) {
break;
} else if (errno == EALREADY) {
LOGW("Bluetoothd already started, unexpectedly!");
break;
}
close(hci_sock);
usleep(100000); // 100 ms retry delay
}
if (attempt == 0) {
LOGE("%s: Timeout waiting for HCI device to come up, error- %d, ",
__FUNCTION__, ret);
if (property_set("ctl.stop", "hciattach") < 0) {
LOGE("Error stopping hciattach");
}
set_bluetooth_power(0);
goto out;
}
LOGI("Starting bluetoothd deamon");
if (property_set("ctl.start", "bluetoothd") < 0) {
LOGE("Failed to start bluetoothd");
set_bluetooth_power(0);
goto out;
}
ret = 0;
out:
if (hci_sock >= 0) close(hci_sock);
return ret;
}
本文详细解析了Android系统中蓝牙服务启动的具体实现方式,包括通过JNI调用底层蓝牙模块的enableNative函数,以及bt_enable函数中涉及的蓝牙设备初始化、蓝牙守护进程启动等关键步骤。
3085

被折叠的 条评论
为什么被折叠?



