2011-10-04 28 views
0

我正嘗試通過JNA使用X11在Java中鎖定顯示器(禁止用戶使用鍵盤和鼠標)。LockDisplay:使用JNA鎖定顯示器時無法加載X11

然而,當我嘗試在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它說,它沒有安裝。當我輸入安裝命令時,我被告知我已經有最新版本了。

這對我來說都非常困惑。如果有人能夠幫助解釋這一點,我將不勝感激!

+0

你說的是'com.sun.jna.examples.unix.X11.Display'類嗎?我傾向於這樣認爲。 – Riduidel

+0

X11不是一個可執行程序,所以輸入「X11」不會運行任何東西。它是一個圖書館(和程序)的集合;您需要「客戶端」庫來通過JNA調用X11庫函數。 – technomage

+0

@Riduidel你在說什麼?錯誤發生在我嘗試獲取X11實例的部分,但是,我最終試圖通過x11.XOpenDisplay(null) – Angeline

回答

0

JNA需要能夠查找libX11.so *,當它查找您要調用的函數。在Linux上,您可能需要設置LD_LIBRARY_PATH以包含X11庫的路徑。 (來自注釋):必須使用LD_LIBRARY_PATH才能找到依賴庫,但設置系統屬性jna.library.path將允許您指示可以找到明確加載的庫的位置(即那些使用Native加載的庫)。的LoadLibrary())。

+0

我在網上做了一個快速搜索,但似乎編輯LD_LIBRARY_PATH似乎不受鼓勵?有沒有辦法編程鏈接到圖書館? – Angeline

+0

我試圖打開文件/etc/ld.so.conf然後編輯它。最初,該文件有這樣的:include /etc/ld.so.conf.d/*.conf 我編輯它,以便它在/etc/ld.so.conf.d/*.conf在一行,然後/ etc/lib,然後運行ldconfig -v。同樣的錯誤仍然發生。我已經嘗試刪除所有內容,只是將/ usr/lib放在文件中,在原始文本後面加上/ usr/lib,用逗號隔開,或者在兩者之間留有空格,這些都不起作用。 我在做什麼錯? – Angeline

+0

嘗試設置jna.library.path以包含libX11.so的路徑,例如 java -Djna.library。path =/some/path:/ some/other/path ... 你*不想爲此編輯系統文件。 – technomage