歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Android Bluetooth HID實現詳解

Android Bluetooth HID實現詳解

日期:2017/3/1 10:13:53   编辑:Linux編程

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. #ifdef HAVE_BLUETOOTH
  3. LOGV(__FUNCTION__);
  4. if (nat) {
  5. const char *c_path = env->GetStringUTFChars(path, NULL);
  6. bool ret = dbus_func_args_async(env, nat->conn, -1, NULL, NULL, nat,
  7. c_path, "org.bluez.Input", "Connect",
  8. DBUS_TYPE_INVALID);
  9. env->ReleaseStringUTFChars(path, c_path);
  10. return ret ? JNI_TRUE : JNI_FALSE;
  11. }
  12. #endif
  13. return JNI_FALSE;
  14. }
  15. static jboolean disconnectSinkNative(JNIEnv *env, jobject object,
  16. jstring path) {
  17. #ifdef HAVE_BLUETOOTH
  18. LOGV(__FUNCTION__);
  19. if (nat) {
  20. const char *c_path = env->GetStringUTFChars(path, NULL);
  21. bool ret = dbus_func_args_async(env, nat->conn, -1, NULL, NULL, nat,
  22. c_path, "org.bluez.Input", "Disconnect",
  23. DBUS_TYPE_INVALID);
  24. env->ReleaseStringUTFChars(path, c_path);
  25. return ret ? JNI_TRUE : JNI_FALSE;
  26. }
  27. #endif
  28. return JNI_FALSE;
  29. }

    這裡要注意將該文件添加到AndroidRuntime.cpp和Android.mk中,否則不會編譯到動態庫中。

    此部分編譯後最終生成libandroid_runtime.so並替換到system/libs下

    Copyright © Linux教程網 All Rights Reserved