Android 關於藍牙的部分使用的是BlueZ協議棧。但是直到目前2.3.3都沒有擴展HID的profile,只是實現了最基本的Handset和d2dp的profile,所以我們的工作涉及到從應用到jni三層的修改,具體修改文件如圖所示,綠色表示新建的類,橙色表示修改的類。
一. 本地層
路徑:framework/base/core/jni/
參照android_server_BluetoothA2dpService.cpp新建android_server_bluetoothHidServer.cpp。該類中主要是通過dbus對bluez協議棧的訪問,dbus 的通用方法都在android_bluetooth_common.cpp中實現,我們做的僅僅是通過dbus_func_args_async調用到bluez提供的input接口。
主要實現以下兩個方法函數:
- static jboolean connectSinkNative(JNIEnv *env, jobject object, jstring path) {
-
- #ifdef HAVE_BLUETOOTH
-
- LOGV(__FUNCTION__);
-
- if (nat) {
-
- const char *c_path = env->GetStringUTFChars(path, NULL);
-
-
-
- bool ret = dbus_func_args_async(env, nat->conn, -1, NULL, NULL, nat,
-
- c_path, "org.bluez.Input", "Connect",
-
- DBUS_TYPE_INVALID);
-
-
-
- env->ReleaseStringUTFChars(path, c_path);
-
- return ret ? JNI_TRUE : JNI_FALSE;
-
- }
-
- #endif
-
- return JNI_FALSE;
-
- }
-
-
-
- static jboolean disconnectSinkNative(JNIEnv *env, jobject object,
-
- jstring path) {
-
- #ifdef HAVE_BLUETOOTH
-
- LOGV(__FUNCTION__);
-
- if (nat) {
-
- const char *c_path = env->GetStringUTFChars(path, NULL);
-
-
-
- bool ret = dbus_func_args_async(env, nat->conn, -1, NULL, NULL, nat,
-
- c_path, "org.bluez.Input", "Disconnect",
-
- DBUS_TYPE_INVALID);
-
-
-
- env->ReleaseStringUTFChars(path, c_path);
-
- return ret ? JNI_TRUE : JNI_FALSE;
-
- }
-
- #endif
-
- return JNI_FALSE;
-
- }
這裡要注意將該文件添加到AndroidRuntime.cpp和Android.mk中,否則不會編譯到動態庫中。
此部分編譯後最終生成libandroid_runtime.so並替換到system/libs下