XGetInputFocus的正确JNA映射是什么

时间:2019-01-20 21:52:36

标签: java x11 jna

我正在尝试通过JNA映射X11 XGetInputFocus。原始方法签名是

XGetInputFocus(Display *display, Window *focus_return, int *revert_to_return)

我假定可以使用已经定义的JNA平台类型将其映射到Java中的以下内容。

void XGetInputFocus(Display display, Window focus_return, IntByReference revert_to_return);

documentation中描述的推荐相关。我现在使用以下代码调用它

final X11 XLIB = X11.INSTANCE;
Window current = new Window();
Display display = XLIB.XOpenDisplay(null);
if (display != null) {
   IntByReference revert_to_return = new IntByReference();
   XLIB.XGetInputFocus(display, current, revert_to_return);
}

但是,它使

使JVM崩溃
# Problematic frame:
# C  [libX11.so.6+0x285b7]  XGetInputFocus+0x57

我想念什么?

1 个答案:

答案 0 :(得分:1)

在本机X11功能中

XGetInputFocus(Display *display, Window *focus_return, int *revert_to_return)

参数Window *focus_return用于返回 Window。 JNA的实现Window非常类似于不变类型, 因为在C语言中,它是由typedef XID Window;定义的。 因此,C中的类型Window*需要映射到JNA中的WindowByReference
(这与C中的int*需要进行映射的原因基本相同 到JNA中的IntByReference

然后扩展的X11界面如下所示:

public interface X11Extended extends X11 {
    X11Extended INSTANCE = (X11Extended) Native.loadLibrary("X11", X11Extended.class);

    void XGetInputFocus(Display display, WindowByReference focus_return, IntByReference revert_to_return);
}

您的代码应作相应修改:

X11Extended xlib = X11Extended.INSTANCE;
WindowByReference current_ref = new WindowByReference();
Display display = xlib.XOpenDisplay(null);
if (display != null) {
    IntByReference revert_to_return = new IntByReference();
    xlib.XGetInputFocus(display, current_ref, revert_to_return);
    Window current = current_ref.getValue();
    System.out.println(current);
}

现在程序不再崩溃。 对我来说,它打印0x3c00605