混合AWT和SWT时出现Java不满意链接错误?

混合AWT和SWT时出现Java不满意链接错误?,java,eclipse,swt,awt,Java,Eclipse,Swt,Awt,我是一名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 c

我是一名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中以应用程序的形式运行它时,会出现以下错误:

线程“main”中出现异常 java.lang.UnsatifiedLink错误: getAppContext(Ljava/lang/Object;)Lsun/awt/AppContext; 在 sun.awt.SunToolkit.getAppContext(本机) 方法)在 sun.awt.SunToolkit.targetToAppContext(未知 来源)在 sun.awt.windows.WComponentPeer.postEvent(未知 来源)在 sun.awt.windows.WComponentPeer.postpaintifneeded(未知 来源)在 sun.awt.windows.WComponentPeer.handlePaint(未知) 来源)在 D3DScreenUpdateManager.RepaitPeerTarget(未知 来源)在 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(未知源) 在java.awt.Component.show(未知 来源)在 java.awt.Component.setVisible(未知 来源)在 java.awt.Window.setVisible(未知 来源)在 main(HelloWorldSWT.java:20)


我做错了什么?

不满意的链接错误表明,当您尝试运行应用程序时,找不到您所依赖的本机库。如果您是在IDE中编译此库,则该库位于生成路径中。如果您使用IDE从运行此程序时出现此错误,则库不在您的运行路径中。检查“运行”对话框,查看生成路径中的库是否位于运行路径中。

未满足链接错误表示在您尝试运行应用程序时,找不到您所依赖的本机库。如果您是在IDE中编译此库,则该库位于生成路径中。如果您使用IDE从运行此程序时出现此错误,则库不在您的运行路径中。检查运行对话框,查看构建路径中的库是否在运行路径中。

如前所述,这表示JVM找不到本机库。由于您混合了AWT/SWT,我假设JVM找不到SWT库(.dll对于windows,.so对于linux,不确定对于mac)。我倾向于使用一个系统属性来告诉java在哪里查找

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

如前所述,这表示JVM找不到本机库。由于您混合了AWT/SWT,我假设JVM找不到SWT库(.dll对于windows,.so对于linux,不确定对于mac)。我倾向于使用一个系统属性来告诉java在哪里查找

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

自3.3版以来,SWT会自动查找所需的特定于平台的库,这些库位于SWT.jar内(位于jar内容的顶层)。因此,您只需要类路径中的swt.jar,它就可以工作了

获得不满意链接错误的一种方法是,如果您正在为另一个平台使用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 JRE],或者只使用可能已安装的其他JRE)

您还可以从shell/command窗口对其进行测试。转到项目目录。该命令应尽可能简单:

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

我让您的代码运行(Vista-32、JDK 6_15),但窗口打开得非常小,无法关闭。不过,我对SWT-AWT桥一无所知,祝你好运……

自3.3版以来,SWT会自动找到它所需的特定于平台的库,这些库位于SWT.jar内(位于jar内容的顶层)。因此,您只需要类路径中的swt.jar,它就可以工作了

获得不满意链接错误的一种方法是,如果您正在为另一个平台使用swt.jar——它们都被命名为“swt.jar”;例如,如果您下载Linux版,并尝试在Windows上使用它。由于所有API级别的代码对于每个平台都是相同的Java,因此该项目将编译为OK,但在运行时会失败,因为本机库是错误的

但是,由于本例中的错误发生在AWT中,因此可能是其他错误,与SWT没有直接关系。首先,确保已下载Windows SWT版本。当您将其导入工作区时,它会创建一个名为org.Eclipse.swt的Eclipse项目,其中包含swt.jar。你那么妈