Android/dev/uinput不工作

Android/dev/uinput不工作,android,android-ndk,linux-device-driver,user-input,vnc-server,Android,Android Ndk,Linux Device Driver,User Input,Vnc Server,我试图通过将数据写入/dev/uinput来控制Android。例如,如果我在我的桌面上输入“A”,代码将根据键盘上的代码将某些内容写入uinput,Android的行为应该与我在手机上输入“A”类似。我正在遵循中的代码。我用JB4.2系统在Nexus4上进行了测试。所有IOCTL都返回阳性结果,这意味着它应该工作。然而,当我输入“A”时,Android似乎只刷新虚拟键盘,不输入任何内容 首先,您需要使用ioctl(m\u fd,UI\u SET\u KEYBIT,key)来“注册”支持的密钥。

我试图通过将数据写入/dev/uinput来控制Android。例如,如果我在我的桌面上输入“A”,代码将根据键盘上的代码将某些内容写入uinput,Android的行为应该与我在手机上输入“A”类似。我正在遵循中的代码。我用JB4.2系统在Nexus4上进行了测试。所有IOCTL都返回阳性结果,这意味着它应该工作。然而,当我输入“A”时,Android似乎只刷新虚拟键盘,不输入任何内容

首先,您需要使用
ioctl(m\u fd,UI\u SET\u KEYBIT,key)
来“注册”支持的密钥。对于A,您应该使用
KEY\u A
,这是在
linux/input.h
\define KEY\u A 30
)中定义的,而不是另一个代码
KEY\u A
。根据我的经验,Android上的
/dev/uinput
与Linux密钥代码一起工作

你应该:

  • 打开
    /dev/uinput
  • ioctl(m\u fd、UI\u SET\u EVBIT、EV\u KEY)
    -支持EV\u KEY事件
  • ioctl(m\u fd、UI\u SET\u EVBIT、EV\u SYN)
    -支持EV\u SYN事件
  • ioctl(m\u fd,UI\u SET\u KEYBIT,key)
    -为您想要支持的每个keycode支持
    key
  • 创建
    uinput\u user\u dev
    结构并填充它,然后将该结构写入
    /dev/uinput
    文件描述符(见下文)
  • 调用
    ioctl(mufd,UI\u DEV\u CREATE)
    创建此设备;MU fd现在将指向新创建的设备
  • 执行监控
    logcat
    输出,并检查设备是否将成功创建。它将采用通用的keychar映射和键布局,因为没有定义键映射。如果要定义它,请查看
    /system/usr/keychars
    /system/usr/keylayout


    创建输入设备 首先,您需要使用
    ioctl(m\u fd,UI\u SET\u KEYBIT,key)
    来“注册”支持的密钥。对于A,您应该使用
    KEY\u A
    ,这是在
    linux/input.h
    \define KEY\u A 30
    )中定义的,而不是另一个代码
    KEY\u A
    。根据我的经验,Android上的
    /dev/uinput
    与Linux密钥代码一起工作

    你应该:

  • 打开
    /dev/uinput
  • ioctl(m\u fd、UI\u SET\u EVBIT、EV\u KEY)
    -支持EV\u KEY事件
  • ioctl(m\u fd、UI\u SET\u EVBIT、EV\u SYN)
    -支持EV\u SYN事件
  • ioctl(m\u fd,UI\u SET\u KEYBIT,key)
    -为您想要支持的每个keycode支持
    key
  • 创建
    uinput\u user\u dev
    结构并填充它,然后将该结构写入
    /dev/uinput
    文件描述符(见下文)
  • 调用
    ioctl(mufd,UI\u DEV\u CREATE)
    创建此设备;MU fd现在将指向新创建的设备
  • 执行监控
    logcat
    输出,并检查设备是否将成功创建。它将采用通用的keychar映射和键布局,因为没有定义键映射。如果要定义它,请查看
    /system/usr/keychars
    /system/usr/keylayout


    创建输入设备
    @用户1659072为您做了这项工作吗?如果是,请将答案标记为正确。很高兴看到一个简短的代码示例,如何实现它。@user1659072这对您有用吗?如果是,请将答案标记为正确。如果能看到一个简短的代码示例,以及如何实现它,那就太好了。
    uinput_user_dev uidev;
    memset(&uidev, 0, sizeof(uidev));
    snprintf(uidev.name, UINPUT_MAX_NAME_SIZE, "uinput-test");
    uidev.id.bustype = BUS_USB;
    uidev.id.vendor  = 0x1212;
    uidev.id.product = 0xabab;
    uidev.id.version = 3;
    write(m_fd, &uidev, sizeof(uidev)