2009-08-07 53 views
0

我是一個Eclipse新手,我試圖構建一個混合的AWT/SWT應用程序。這裏是我的代碼:混合AWT和SWT時Java UnsatisfiedLinkError?

public class HelloWorldSWT { 

    public static void main(String[] args) { 
     Frame frame = new Frame("My AWT Frame"); // java.awt.Frame 
     frame.setLayout(new BorderLayout()); 
     Canvas canvas = new Canvas(); // java.awt.Canvas 
     frame.add(canvas, BorderLayout.CENTER); 
     frame.setVisible(true); 

     Display display = new Display(); // display object to manage SWT lifecycle. 
     Shell swtShell = SWT_AWT.new_Shell(display, canvas); 
     Button m_button = new Button(swtShell, SWT.PUSH); 
     m_button.setText("button"); 

     // invoke the AWT frame rendering by making the frame visible 
     // This starts the EDT 
     frame.setVisible(true); 

     // standard SWT dispatch loop 
     while(!swtShell.isDisposed()) 
     { 
      if(!display.readAndDispatch()) 
       display.sleep(); 
     } 
     swtShell.dispose(); 
    } 
} 

編譯沒有問題,但是當我在Eclipse中運行它的應用程序,我得到以下錯誤:

Exception in thread "main" java.lang.UnsatisfiedLinkError: sun.awt.SunToolkit.getAppContext(Ljava/lang/Object;)Lsun/awt/AppContext; at sun.awt.SunToolkit.getAppContext(Native Method) at sun.awt.SunToolkit.targetToAppContext(Unknown Source) at sun.awt.windows.WComponentPeer.postEvent(Unknown Source) at sun.awt.windows.WComponentPeer.postPaintIfNecessary(Unknown Source) at sun.awt.windows.WComponentPeer.handlePaint(Unknown Source) at sun.java2d.d3d.D3DScreenUpdateManager.repaintPeerTarget(Unknown Source) at sun.java2d.d3d.D3DScreenUpdateManager.createScreenSurface(Unknown Source) at sun.awt.windows.WComponentPeer.replaceSurfaceData(Unknown Source) at sun.awt.windows.WComponentPeer.replaceSurfaceData(Unknown Source) at sun.awt.windows.WComponentPeer.setBounds(Unknown Source) at sun.awt.windows.WWindowPeer.setBounds(Unknown Source) at sun.awt.windows.WComponentPeer.initialize(Unknown Source) at sun.awt.windows.WCanvasPeer.initialize(Unknown Source) at sun.awt.windows.WPanelPeer.initialize(Unknown Source) at sun.awt.windows.WWindowPeer.initialize(Unknown Source) at sun.awt.windows.WFramePeer.initialize(Unknown Source) at sun.awt.windows.WComponentPeer.(Unknown Source) at sun.awt.windows.WCanvasPeer.(Unknown Source) at sun.awt.windows.WPanelPeer.(Unknown Source) at sun.awt.windows.WWindowPeer.(Unknown Source) at sun.awt.windows.WFramePeer.(Unknown Source) at sun.awt.windows.WToolkit.createFrame(Unknown Source) at java.awt.Frame.addNotify(Unknown Source) at java.awt.Window.show(Unknown Source) at java.awt.Component.show(Unknown Source) at java.awt.Component.setVisible(Unknown Source) at java.awt.Window.setVisible(Unknown Source) at HelloWorldSWT.main(HelloWorldSWT.java:20)

我在做什麼錯?

回答

3

由於3.3版本,SWT自動找到其所需的平臺特定的庫,這是SWT.JAR(在的JAR內容的頂層)的內部。所以你需要的是swt.jar在類路徑中,並且它工作。

獲得UnsatisifiedLinkError的一種方法是,如果您使用另一個平臺的swt.jar - 它們都被命名爲「swt.jar」;例如,如果你下載一個用於Linux的,並嘗試在Windows上使用它。由於所有API級別的代碼對於每個平臺都是相同的Java,所以該項目將編譯成OK,但是由於本機庫錯誤而在運行時會失敗。

但是,由於這種情況下的錯誤發生在AWT中,它可能是別的,與SWT沒有直接關係。首先,確保你已經下載了Windows SWT版本。當您將它導入到工作區時,它會創建一個名爲org.eclipse.swt的Eclipse項目,其中包含swt.jar。然後,您可以使org.eclipse.swt成爲您項目的必需項目,除了有效的乾淨JRE(您可以嘗試定義一個新窗口[Window - > Preferences - > Java - > Installed JREs]或者只是使用你可能已經安裝的不同的)。

您也可以從shell /命令窗口對其進行測試。轉到您的項目目錄。該命令應該是簡單:

java -cp bin;..\org.eclipse.swt\swt.jar HelloWorldSWT 

我得到了你的代碼運行(Windows Vista的32,JDK 6_15),但窗口非常小開,也不會關閉。我對SWT-AWT橋樑一無所知,所以祝你好運......

+0

謝謝,我會試試看。 – 2009-08-08 18:14:07

+0

原來我引用了錯誤的SWT jar文件。謝謝你的幫助。 – 2009-08-23 17:53:08

1

UnsatisfiedLinkError指示當您嘗試運行您的應用程序時,找不到您所依賴的本機庫。如果你正在編譯你的IDE,那麼這個庫就在你的構建路徑中。如果您使用IDE運行此程序併發生此錯誤,則libray不在您的運行路徑中。檢查您的運行對話框,看看您的構建路徑中的庫位於您的運行路徑中。

1

如上所述,這表明JVM找不到本機庫。由於你在混合AWT/SWT,我假設JVM找不到SWT庫(.dll的windows,.so for linux,不知道mac)。我偏愛使用系統屬性來告訴Java在哪裏看。

-Djava.library.path=<absolute path to the .dll/.so that SWT needs> 
0

我有完全相同的問題,只能通過徹底刪除和重新安裝Java來解決它。似乎不知何故,其中一個包含原生AWT方法的DLL已經搞砸了。

0

我已經解決了這個問題,我 搜索這個信息很長一段時間,但我不能找到一個解決我的問題, 後,我檢查我的Java版本

我發現,JDK和JRE版本不同的是, 例如

我發現我的文件系統上的一個額外的文件

JDK 1.4 JRE 1.4 JRE 1.5(額外)

你應該刪除新版本的jre(jre1.5)

然後確定,我的英文很差,我希望我的留言能幫個忙,如果你有一些問題,可以聯繫我,email:fish2 [email protected]