Какое правильное сопоставление JNA для XGetInputFocus - PullRequest
0 голосов
/ 21 января 2019

Я пытаюсь отобразить X11 XGetInputFocus через JNA.Исходная сигнатура метода -

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

. Я предполагаю, что она может быть сопоставлена ​​со следующим в Java с использованием уже определенных типов платформы JNA.

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

Что соответствует рекомендации, описанной в документация .Теперь я вызываю его, используя следующий код

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 голосов
/ 21 января 2019

В родной функции X11

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

параметр Window *focus_return используется для возврата a Window. JNA реализовал Window очень похоже на неизменный тип, потому что в языке C это определяется как typedef XID Window;. Поэтому тип Window* в C необходимо сопоставить с WindowByReference в JNA.
(По сути, это та же самая причина, по которой int* в C нужно было до IntByReference в JNA.)

Тогда расширенный 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.

...