歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

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下

    Copyright © Linux教程網 All Rights Reserved