Java UnsatisfiedLinkError при смешивании AWT и SWT? - PullRequest
0 голосов
/ 07 августа 2009

Я новичок в Eclipse и пытаюсь создать смешанное приложение 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, я получаю следующую ошибку:

Исключение в теме "главная" java.lang.UnsatisfiedLinkError: sun.awt.SunToolkit.getAppContext (Ljava / языки / объект;) Lsun / AWT / контекст приложение; в sun.awt.SunToolkit.getAppContext (Native Метод) в sun.awt.SunToolkit.targetToAppContext (Неизвестно Источник) в sun.awt.windows.WComponentPeer.postEvent (Неизвестно Источник) в sun.awt.windows.WComponentPeer.postPaintIfNecessary (Неизвестно Источник) в sun.awt.windows.WComponentPeer.handlePaint (Неизвестно Источник) в sun.java2d.d3d.D3DScreenUpdateManager.repaintPeerTarget (Неизвестно Источник) в sun.java2d.d3d.D3DScreenUpdateManager.createScreenSurface (Неизвестно Источник) в sun.awt.windows.WComponentPeer.replaceSurfaceData (Неизвестно Источник) в sun.awt.windows.WComponentPeer.replaceSurfaceData (Неизвестно Источник) в sun.awt.windows.WComponentPeer.setBounds (Неизвестно Источник) в sun.awt.windows.WWindowPeer.setBounds (Неизвестно Источник) в sun.awt.windows.WComponentPeer.initialize (Неизвестно Источник) в sun.awt.windows.WCanvasPeer.initialize (Неизвестно Источник) в sun.awt.windows.WPanelPeer.initialize (Неизвестно Источник) в sun.awt.windows.WWindowPeer.initialize (Неизвестно Источник) в sun.awt.windows.WFramePeer.initialize (Неизвестно Источник) в sun.awt.windows.WComponentPeer (Неизвестно. Источник) в sun.awt.windows.WCanvasPeer (Неизвестно. Источник) в sun.awt.windows.WPanelPeer (Неизвестно. Источник) в sun.awt.windows.WWindowPeer (Неизвестно. Источник) в sun.awt.windows.WFramePeer (Неизвестно. Источник) в sun.awt.windows.WToolkit.createFrame (Неизвестно Источник) в java.awt.Frame.addNotify (Неизвестно Источник) в java.awt.Window.show (неизвестный источник) at java.awt.Component.show (Неизвестно Источник) в java.awt.Component.setVisible (Неизвестно Источник) в java.awt.Window.setVisible (Неизвестно Источник) в HelloWorldSWT.main (HelloWorldSWT.java:20)

Что я делаю не так?

Ответы [ 5 ]

3 голосов
/ 07 августа 2009

Начиная с версии 3.3, SWT автоматически находит необходимые библиотеки для конкретной платформы, которые находятся внутри 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, так что удачи в этом ....

1 голос
/ 07 августа 2009

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

-Djava.library.path=<absolute path to the .dll/.so that SWT needs>
1 голос
/ 07 августа 2009

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

0 голосов
/ 20 сентября 2009

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

я обнаружил, что jdk и jre версия разные, например

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

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

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

тогда хорошо, мой английский плохой, я надеюсь, что мое сообщение окажет услугу, если у вас есть какие-либо вопросы, вы можете связаться со мной, электронная почта: fish2-2@163.com

0 голосов
/ 23 августа 2009

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

...