我正在尝试通过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
我想念什么?
答案 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
。