Java /dev/input/eventX

问题描述 投票:0回答:1

目前我有一个 N-Trig Multitouch 面板连接到事件文件 /dev/input/event4,并且我正在尝试 this 来访问它。我已将所有本机等包含在 java.library.path 中,但即使是超级用户也会收到此错误。例外:

java.io.IOException: Invalid argument
    at sun.nio.ch.FileDispatcherImpl.read0(Native Method)
    at sun.nio.ch.FileDispatcherImpl.read(FileDispatcherImpl.java:46)
    at sun.nio.ch.IOUtil.readIntoNativeBuffer(IOUtil.java:223)
    at sun.nio.ch.IOUtil.read(IOUtil.java:197)
    at sun.nio.ch.FileChannelImpl.read(FileChannelImpl.java:149)
    at com.dgis.input.evdev.EventDevice.readEvent(EventDevice.java:269)
    at com.dgis.input.evdev.EventDevice.access$1(EventDevice.java:265)
    at com.dgis.input.evdev.EventDevice$1.run(EventDevice.java:200)
EVENT:  null
Exception in thread "Thread-0" java.lang.NullPointerException
    at com.asdev.t3.Bootstrap$1.event(Bootstrap.java:41)
    at com.dgis.input.evdev.EventDevice.distributeEvent(EventDevice.java:256)
    at com.dgis.input.evdev.EventDevice.access$2(EventDevice.java:253)
    at com.dgis.input.evdev.EventDevice$1.run(EventDevice.java:201)

有谁知道为什么会发生这种情况?谢谢

java linux events hid
1个回答
4
投票

我在项目的问题页面回答了这个问题。

作者:阿提拉帕拉
你好,我尝试在 Raspberry Pi 上使用这个库,得到了同样的结果 例外,但我找出了问题的根源并设法 让它发挥作用。 基本上,问题是这个库是 仅针对 64 位 CPU/操作系统编写。说明:

input_event 结构如下所示(来源):

struct input_event {
    struct timeval time;
    unsigned short type;
    unsigned short code;
    unsigned int value;
};

这里我们有 timeval,它有以下成员(来源):

time_t         tv_sec      seconds
suseconds_t    tv_usec     microseconds

这两种类型在 32 位和 64 位上的表示方式不同 系统。

解决方案:

  1. 将 input_event 的大小从 24 字节更改为 16 字节:

更改源文件第34行 evdev-java/src/com/dgis/input/evdev/InputEvent.java 来自此:

        public static final int STRUCT_SIZE_BYTES = 24;

对此:

        public static final int STRUCT_SIZE_BYTES = 16; 

在同一源文件中更改解析函数,如下所示:

    public static InputEvent parse(ShortBuffer shortBuffer, String source) throws IOException {
        InputEvent e = new InputEvent();
        short a,b,c,d;
    
        a=shortBuffer.get();
        b=shortBuffer.get();
        //c=shortBuffer.get();
        //d=shortBuffer.get();
        e.time_sec = (b<<16) | a; //(d<<48) | (c<<32) | (b<<16) | a;
        a=shortBuffer.get();
        b=shortBuffer.get();
        //c=shortBuffer.get();
        //d=shortBuffer.get();
        e.time_usec = (b<<16) | a; //(d<<48) | (c<<32) | (b<<16) | a;
        e.type = shortBuffer.get();
        e.code = shortBuffer.get();
        c=shortBuffer.get();
        d=shortBuffer.get();
        e.value = (d<<16) | c;
        e.source = source;
    
        return e;
    }
© www.soinside.com 2019 - 2024. All rights reserved.