Android Bluetooth HID实现详解
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接口。
主要实现以下两个方法函数:
- 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下
|
评论暂时关闭