LockDisplay: невозможно загрузить X11 при использовании JNA для блокировки отображения

#java #linux #x11 #jna

#java #linux #x11 #jna

Вопрос:

Я пытаюсь заблокировать отображение (запрещая пользователю использовать клавиатуру и мышь) на Java, используя X11 через JNA.

Однако, когда я пытаюсь запустить приложение в Windows, я получаю эту ошибку:

 java.lang.UnsatisfiedLinkError: Unable to load library 'X11': com.sun.jna.Native.open(Ljava/lang/String;)J
    at com.sun.jna.NativeLibrary.loadLibrary(NativeLibrary.java:166)
    at com.sun.jna.NativeLibrary.getInstance(NativeLibrary.java:239)
    at com.sun.jna.Library$Handler.<init>(Library.java:140)
    at com.sun.jna.Native.loadLibrary(Native.java:393)
    at com.sun.jna.Native.loadLibrary(Native.java:378)
    at com.sun.jna.platform.unix.X11.<clinit>(X11.java:347)
    at octostar.LinuxHelper.blockInput(LinuxHelper.java:77)
    at .... ....
  

Мой код таков (входной параметр представляет собой логический «блок»):

         boolean returnVal = true;
        X11.Display dpy = null;
        final X11 x11 = X11.INSTANCE;
        final Xss xss = Xss.INSTANCE;

        try {
            dpy = x11.XOpenDisplay(null);
            if (block)
                xss.XLockDisplay(dpy);
            else
                xss.XUnlockDisplay(dpy);

        } catch (Exception ex){
            returnVal = false;
        } finally {
            if (dpy != null)
                    x11.XCloseDisplay(dpy);
            dpy = null;
        }

        return returnVal;
  

Ошибка возникает в X11.INSTANCE (который является строкой octostar.LinuxHelper.BlockInput(LinuxHelper.java: 77), как в сообщении об ошибке выше)

В другой части моего кода я получаю эту ошибку:

 java.lang.NoClassDefFoundError: Could not initialize class com.sun.jna.platform.unix.X11
    at octostar.LinuxHelper.getIdleTimeMillis(LinuxHelper.java:50)
  

Я попытался ввести X11 в терминале, и мне сказали выполнить установку, что я и сделал после этого, но каждый последующий раз, когда я набираю X11, он говорит, что он не установлен. Однако, когда я набираю команду установки, мне говорят, что у меня уже есть последняя версия.

Все это меня очень смущает. Если кто-нибудь может помочь пролить некоторый свет на это, я был бы очень признателен!

Комментарии:

1. Вы говорите о com.sun.jna.examples.unix.X11.Display классе? Я склонен так думать.

2. X11 не является исполняемой программой, поэтому ввод «X11» ничего не запустит. Это набор библиотек (и программ); вам нужны «клиентские» библиотеки, чтобы вызывать библиотечные функции X11 через JNA.

3. @Riduidel о какой части вы говорите? ошибка возникает в той части, где я пытаюсь получить экземпляр X11, но да, в конечном итоге я пытаюсь получить отображение через x11.XOpenDisplay(null)

4. @technomage Ах, да… На самом деле я просто пытался набрав X11 в консоли (потому что я не слишком знаком с Linux). Мне было интересно, возможно ли, что он не существует на моем компьютере, и мне нужно было его установить (поскольку ошибка продолжала говорить, что он не может загрузиться), или если это может дать мне какое-то полезное сообщение. Поскольку сообщение действительно появилось, я последовал за ним и просто запутался. Как вы можете сказать, я немного новичок в этом.

5. Microsoft Windows обычно не включает X11 — вы установили какую-либо версию X11 в системе, или вы не имеете в виду ОС Microsoft, когда говорите «когда я пытаюсь запустить приложение в Windows»?

Ответ №1:

JNA должна иметь возможность находить libX11.so * когда он ищет функции, которые вы вызываете. В Linux вам может потребоваться задать LD_LIBRARY_PATH для включения пути к библиотекам X11.

(из комментариев): Для поиска зависимых библиотек необходимо использовать LD_LIBRARY_PATH, но установка системного свойства jna.library.path позволит вам указать, где могут быть найдены явно загруженные библиотеки (т. Е. Загруженные с помощью Native.LoadLibrary()).

Комментарии:

1. Я провел быстрый поиск в Интернете, но, похоже, редактирование LD_LIBRARY_PATH, похоже, не рекомендуется? Есть ли способ программной ссылки на библиотеку?

2. Я попытался открыть файл /etc/ld.so.conf, а затем отредактировать его. Изначально в файле было следующее: включить /etc/ld.so.conf.d/*.conf Я отредактировал его так, чтобы в одной строке был /etc/ld.so.conf.d/*.conf, а затем /etc/lib в следующей, а затем запустил ldconfig-v. По-прежнему возникают те же ошибки. Я попытался удалить все и просто поместить /usr/lib в файл, добавив /usr/lib за исходным текстом с запятой между ними или с пробелом между ними, и все они не работают. Что я делаю не так?

3. Попробуйте установить jna.library.path, чтобы включить путь к libX11.so , например, java -Djna.library.path=/some/path:/some/other/path … Вы не хотите редактировать системные файлы для этой цели.

4. Проверьте, есть ли версия JNA, уже установленная в вашей системе.

5. Мне удалось устранить ошибку и проверить, что мне удалось получить отображение, хотя блокировка экрана по-прежнему не работает — я не знаю почему, связавшись с библиотекой, используя это: System.setProperty(«jna.library.path», «/ usr / lib»);Спасибо!