Java 使用uinput驱动程序创建虚拟多点触控设备

Java 使用uinput驱动程序创建虚拟多点触控设备,java,android,java-native-interface,linux-device-driver,Java,Android,Java Native Interface,Linux Device Driver,我正在尝试在没有触摸屏的android设备上注入事件。我正在使用用户空间输入设备(uinput)来执行此操作,但它不起作用 我正在使用以下代码: fd_virtual_dev = open("/dev/uinput", O_WRONLY | O_NONBLOCK); if (fd_virtual_dev < 0) return die("error: open"); if (ioctl(fd_virtual_dev, UI_SET_EVBIT, EV_ABS) < 0)

我正在尝试在没有触摸屏的android设备上注入事件。我正在使用用户空间输入设备(uinput)来执行此操作,但它不起作用

我正在使用以下代码:

fd_virtual_dev = open("/dev/uinput", O_WRONLY | O_NONBLOCK);
if (fd_virtual_dev < 0)
    return die("error: open");

if (ioctl(fd_virtual_dev, UI_SET_EVBIT, EV_ABS) < 0)
    return die("error: ioctl ev_abs");
if (ioctl(fd_virtual_dev, UI_SET_EVBIT, EV_SYN) < 0)
    return die("error: ioctl ev_syn");
if (ioctl(fd_virtual_dev,UI_SET_ABSBIT,ABS_MT_TOUCH_M AJOR) < 0)
    return die("error: ioctl ABS_MT_TOUCH_MAJOR");
if (ioctl(fd_virtual_dev,UI_SET_ABSBIT,ABS_MT_WIDTH_M AJOR) < 0)
    return die("error: ioctl ABS_MT_TOUCH_MAJOR");
if (ioctl(fd_virtual_dev,UI_SET_ABSBIT,ABS_MT_POSITIO N_X) < 0)
    return die("error: ioctl ABS_MT_POSITION_X");
if (ioctl(fd_virtual_dev,UI_SET_ABSBIT,ABS_MT_POSITIO N_Y) < 0)
    return die("error: ioctl ABS_MT_POSITION_Y");
if (ioctl(fd_virtual_dev,UI_SET_ABSBIT,ABS_MT_TRACKIN G_ID) < 0)
    return die("error: ioctl ABS_MT_TRACKING_ID");
if (ioctl(fd_virtual_dev,UI_SET_ABSBIT,ABS_MT_SLOT) < 0)
    return die("error: ioctl");
if (ioctl(fd_virtual_dev,UI_SET_ABSBIT,ABS_MT_PRESSUR E) < 0)
    return die("error: ioctl ABS_MT_PRESSURE");

memset(&uidev, 0, sizeof(uidev));
snprintf(uidev.name, UINPUT_MAX_NAME_SIZE, "uinput-device");
uidev.id.bustype = BUS_VIRTUAL;
uidev.id.vendor = 0x0;
uidev.id.product = 0x0;
uidev.id.version = 0;    
uidev.absmax[ABS_MT_TOUCH_MAJOR] = 64;
uidev.absmax[ABS_MT_WIDTH_MAJOR] = 64;
uidev.absmax[ABS_MT_POSITION_X] = 1024;
uidev.absmax[ABS_MT_POSITION_Y] = 800;
uidev.absmax[ABS_MT_TRACKING_ID] = 65535;
uidev.absmax[ABS_MT_SLOT] = 9;
uidev.absmax[ABS_MT_PRESSURE] = 64;
fd_virtual_dev=open(“/dev/uinput”,O_WRONLY | O_NONBLOCK);
如果(fd_虚拟_开发<0)
返回模具(“错误:打开”);
if(ioctl(fd_虚拟开发、UI_设置、EVBIT、EV_ABS)<0)
返回模具(“错误:ioctl ev_abs”);
if(ioctl(fd_virtual_dev,UI_SET_EVBIT,EV_SYN)<0)
返回模具(“错误:ioctl ev_syn”);
如果(ioctl(fd\U虚拟设备、UI\U设置\U ABSBIT、ABS\U MT\U触摸面板)<0)
返回模具(“错误:ioctl ABS\u MT\u TOUCH\u MAJOR”);
如果(ioctl(fd\U虚拟开发、UI\U设置\U ABSBIT、ABS\U MT\U宽度\U M AJOR)<0)
返回模具(“错误:ioctl ABS\u MT\u TOUCH\u MAJOR”);
如果(ioctl(fd虚拟开发、UI设置、ABSBIT、ABS位置X)<0)
返回模具(“错误:ioctl ABS\u MT\u POSITION\u X”);
如果(ioctl(fd虚拟开发、UI设置、ABSBIT、ABS位置)<0)
返回模具(“错误:ioctl ABS\u MT\u POSITION\u Y”);
如果(ioctl(fd_虚拟开发、UI_设置、ABSBIT、ABS_MT_跟踪G_ID)<0)
返回模具(“错误:ioctl ABS\u MT\u TRACKING\u ID”);
如果(ioctl(fd\U虚拟\U开发、UI\U设置\U ABSBIT、ABS\U MT\U插槽)<0)
返回模具(“错误:ioctl”);
如果(ioctl(fd虚拟开发、UI设置、ABS压力)<0)
回模(“错误:ioctl ABS\u MT\u压力”);
memset(&uidev,0,sizeof(uidev));
snprintf(uidev.name,UINPUT_MAX_name_SIZE,“UINPUT设备”);
uidev.id.bustype=总线虚拟;
uidev.id.vendor=0x0;
uidev.id.product=0x0;
uidev.id.version=0;
uidev.absmax[ABS\u MT\u TOUCH\u MAJOR]=64;
uidev.absmax[ABS\U MT\U WIDTH\U MAJOR]=64;
uidev.absmax[ABS\u MT\u POSITION\u X]=1024;
uidev.absmax[ABS\u MT\u POSITION\u Y]=800;
uidev.absmax[ABS\u MT\u TRACKING\u ID]=65535;
uidev.absmax[ABS\u MT\u SLOT]=9;
uidev.absmax[绝对压力]=64;
现在,如果我尝试发送多点触控protocolo B事件,我只能在屏幕上看到一个psedoorandom点上的一个小圆圈

我也尝试了protocoll A和触摸屏手机,结果也一样
阿方索

尝试添加以下ioctl呼叫:

ioctl(dev_file, UI_SET_PROPBIT, INPUT_PROP_DIRECT)
如果不起作用,您需要在
/system/usr/IDC
下为指定的产品和供应商ID添加IDC文件(如上所述)。在您的情况下,它将是<代码> /St/Urr/IdC/VANDRORYO9000SufftTythOn.IDC ,但是考虑使用独特的产品/供应商值。 IDC文件应指定设备为触摸屏:
touch.deviceType=触摸屏


如果没有IDC文件,该设备很可能被识别为鼠标,从而形成一个小圆圈。如果您正在构建一个定制的Android映像,您可以将IDC文件放到Android源代码树的
/out/target/product//system/usr/IDC
下。否则,请尝试通过“adb外壳”上载IDC。

如果您包含的头文件“uinput.h”中未定义UI\u SET\u PROPBIT,请添加以下行:

#define UI_SET_PROPBIT    _IOW(UINPUT_IOCTL_BASE, 110, int)
行前:

ioctl(uinput_fd, UI_SET_PROPBIT, INPUT_PROP_DIRECT)

我在Nexus7上测试了它。触摸事件运行良好,但无法应用于Android系统虚拟按钮(返回、主页和最近),这是一个不同的问题。

您解决了问题吗?我也在寻找一种方法来创建多点触控设备,使用uinput作为您的,但我甚至不能创建一个单点触控。所以我想得到你的帮助。不!我找不到任何有效的解决办法