#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»);Спасибо!