java - JNA 联合结构映射

标签 java mapping structure union jna

在 JNA 中,如何从 Xlib 映射联合结构,如以下 XEvent

typedef union _XEvent {
    int type;    /* must not be changed */
    XAnyEvent xany;
    XKeyEvent xkey;
    XButtonEvent xbutton;
    XMotionEvent xmotion;
    XCrossingEvent xcrossing;
    XFocusChangeEvent xfocus;
    XExposeEvent xexpose;
    XGraphicsExposeEvent xgraphicsexpose;
    XNoExposeEvent xnoexpose;
    XVisibilityEvent xvisibility;
    XCreateWindowEvent xcreatewindow;
    XDestroyWindowEvent xdestroywindow;
    XUnmapEvent xunmap;
    XMapEvent xmap;
    XMapRequestEvent xmaprequest;
    XReparentEvent xreparent;
    XConfigureEvent xconfigure;
    XGravityEvent xgravity;
    XResizeRequestEvent xresizerequest;
    XConfigureRequestEvent xconfigurerequest;
    XCirculateEvent xcirculate;
    XCirculateRequestEvent xcirculaterequest;
    XPropertyEvent xproperty;
    XSelectionClearEvent xselectionclear;
    XSelectionRequestEvent xselectionrequest;
    XSelectionEvent xselection;
    XColormapEvent xcolormap;
    XClientMessageEvent xclient;
    XMappingEvent xmapping;
    XErrorEvent xerror;
    XKeymapEvent xkeymap;
    long pad[24];
} XEvent;

我希望稍后能够根据接收到的事件类型将 JNA 中的 XEvent 转换为其他事件(如 XKeyEvent、XButtonEvent、XMotionEvent ...等)。

我并不是要求对上述所有结构进行完整映射。一个清晰的解释和一个关于如何做的小例子就足够了。

谢谢

最佳答案

使用 JNA contrib (com.sun.jna.platform.X11) 中定义的映射,然后执行以下操作:

  1. 使用您喜欢的任何方法(例如 XNextEvent)获取 XEvent。
  2. 使用类型字段确定事件的类型。
  3. 根据类型调用字段名(字符串形式)的readFiled方法,并将返回值强制转换为字段名的事件类型。

例子:

XEvent event = new XEvent();
X11.INSTANCE.XNextEvent(display, event);
if(event.type == X11.KeyPress) {
    XKeyEvent xKey = (XKeyEvent)event.readField("xkey");
    // you can now use xKey.keycode and other fields
}

关于java - JNA 联合结构映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3103332/

相关文章:

java - 使用 Reflections 创建新的类实例

Java - 使用属性作为键从流创建 HashMap

Elasticsearch 关系映射(一对一和一对多)

c - 如何在运行时在 c 中给出结构数组成员的大小

python - 我是否正确组织了我的 Django 应用程序?

c - 传递给另一个方法的结构体数组

java - 哈希函数 djb2 有 java 版本吗?

java - 如何使用java控制音量...?

NHibernate DTO 映射

java - JAXB 和集合中的继承