2009-08-07 4 views
0

Я новичок Eclipse, и я пытаюсь создать смешанное приложение AWT/SWT. Вот мой код:Java UnsatisfiedLinkError при смешивании AWT и SWT?

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.jar (на верхнем уровне содержания JAR). Итак, все, что вам нужно, это swt.jar в classpath, и оно работает.

Один из способов получить UnsatisifiedLinkError - если вы используете swt.jar для другой платформы - все они называются «swt.jar»; например, если вы загружаете файл для Linux и пытаетесь использовать его в Windows. Проект будет компилировать ОК, поскольку весь код API-уровня является одним и тем же Java для каждой платформы, но он будет терпеть неудачу при запуске, потому что родные библиотеки ошибочны.

Однако, поскольку ошибка в этом случае происходит в AWT, это может быть что-то другое, не связанное напрямую с SWT. Во-первых, убедитесь, что вы загрузили выпуск Windows SWT. Когда вы импортируете его в свое рабочее пространство, он создает проект Eclipse с именем org.eclipse.swt, который содержит swt.jar. Затем вы делаете org.eclipse.swt требуемым проектом для вашего проекта, и ничто другое в пути сборки, кроме корректной чистой JRE (вы можете попробовать определить новую [Window -> Preferences -> Java -> Installed JREs], или просто используйте другой, который вы, возможно, установили).

Вы также можете проверить его из окна оболочки/команды. Перейдите в каталог проекта. Команда должна быть столь же простым, как:

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

Я получил код для запуска (Vista-32, JDK 6_15), но окно открыто очень мало, и не будет близко. Я ничего не знаю о мосте SWT-AWT, так что удачи с этим ....

+0

Спасибо, я попробую. –

+0

Оказывается, я ссылался на неправильный файл jar SWT. Спасибо за вашу помощь. –

1

UnsatisfiedLinkError указывает на то, что некоторая собственная библиотека, на которую вы полагаетесь, не найдена, когда вы пытаетесь запустить приложение. Если вы компилируете это в своей среде IDE, библиотека находится в вашем пути сборки. Если вы запускаете это из своей среды IDE и получаете эту ошибку, libray не находится в вашем пути запуска. Проверьте свой диалог запуска, чтобы увидеть, что библиотеки, которые у вас есть в пути сборки, находятся в вашем пути выполнения.

1

Как уже упоминалось, это указывает на то, что JVM не может найти родную библиотеку. Поскольку вы смешиваете AWT/SWT, я предполагаю, что JVM не может найти библиотеки SWT (DLL для Windows, .so для Linux, не уверен для Mac). Я неполный, чтобы использовать системное свойство, чтобы сказать java, где искать.

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

У меня была точно такая же проблема, и я мог решить ее только путем полного удаления и повторной установки Java. Кажется, что одна из DLL-библиотек, содержащих собственные методы AWT, сумела запутаться.

0

Я уже решил эту проблему, я ищу эту информацию в течение длительного времени, но я не могу найти то, чтобы решить мою проблему, после я проверить мою версию Java

я обнаружил, что JDK и JRE версия отличается, например

я обнаружил, что один дополнительный документ на моей файловой системе

JDK 1,4 JRE 1,4 JRE 1,5 (за дополнительную плату)

вам должен удалить новую версию jre (jre1.5)

, тогда хорошо, мой английский плохой, я надеюсь, что мое сообщение сделает одолжение, если у вас есть вопрос, вы можете подключиться ко мне, электронная почта: fish2 [email protected]