Android Bluetooth HID实现详解


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接口。

主要实现以下两个方法函数:

  1. static jboolean connectSinkNative(JNIEnv *env, jobject object, jstring path) {  
  2.   
  3. #ifdef HAVE_BLUETOOTH   
  4.   
  5.     LOGV(__FUNCTION__);  
  6.   
  7.     if (nat) {  
  8.   
  9.         const char *c_path = env->GetStringUTFChars(path, NULL);  
  10.   
  11.    
  12.   
  13.         bool ret = dbus_func_args_async(env, nat->conn, -1, NULL, NULL, nat,  
  14.   
  15.                                     c_path, "org.bluez.Input""Connect",  
  16.   
  17.                                     DBUS_TYPE_INVALID);  
  18.   
  19.    
  20.   
  21.         env->ReleaseStringUTFChars(path, c_path);  
  22.   
  23.         return ret ? JNI_TRUE : JNI_FALSE;  
  24.   
  25.     }  
  26.   
  27. #endif   
  28.   
  29.     return JNI_FALSE;  
  30.   
  31. }  
  32.   
  33.    
  34.   
  35. static jboolean disconnectSinkNative(JNIEnv *env, jobject object,  
  36.   
  37.                                      jstring path) {  
  38.   
  39. #ifdef HAVE_BLUETOOTH   
  40.   
  41.     LOGV(__FUNCTION__);  
  42.   
  43.     if (nat) {  
  44.   
  45.         const char *c_path = env->GetStringUTFChars(path, NULL);  
  46.   
  47.    
  48.   
  49.         bool ret = dbus_func_args_async(env, nat->conn, -1, NULL, NULL, nat,  
  50.   
  51.                                     c_path, "org.bluez.Input""Disconnect",  
  52.   
  53.                                     DBUS_TYPE_INVALID);  
  54.   
  55.    
  56.   
  57.         env->ReleaseStringUTFChars(path, c_path);  
  58.   
  59.         return ret ? JNI_TRUE : JNI_FALSE;  
  60.   
  61.     }  
  62.   
  63. #endif   
  64.   
  65.     return JNI_FALSE;  
  66.   
  67. }  

    这里要注意将该文件添加到AndroidRuntime.cpp和Android.mk中,否则不会编译到动态库中。

    此部分编译后最终生成libandroid_runtime.so并替换到system/libs下

    • 1
    • 2
    • 3
    • 下一页

    相关内容