Java 桌面SWT应用程序赢得';t在Ubuntu中的Eclipse下运行

Java 桌面SWT应用程序赢得';t在Ubuntu中的Eclipse下运行,java,eclipse,ubuntu,gtk,swt,Java,Eclipse,Ubuntu,Gtk,Swt,我正在尝试将SWT桌面应用程序移植到Ubuntu。下载了适用于Ubuntu和swt-4.6.2-gtk-linux-x86_64.zip的Eclipse Neon(6.4.2),在项目构建路径中配置了库,以从下载的swt zip指向swt.jar。 Eclipse工作正常,应用程序得到编译,但在尝试执行以下代码行时崩溃: Display display = Display.getDefault(); 这是程序中对SWT的第一次调用。 Eclipse向控制台写入以下消息: (SWT:33

我正在尝试将SWT桌面应用程序移植到Ubuntu。下载了适用于Ubuntu和swt-4.6.2-gtk-linux-x86_64.zip的Eclipse Neon(6.4.2),在项目构建路径中配置了库,以从下载的swt zip指向swt.jar。
Eclipse工作正常,应用程序得到编译,但在尝试执行以下代码行时崩溃:

    Display display = Display.getDefault();
这是程序中对SWT的第一次调用。
Eclipse向控制台写入以下消息:

(SWT:3351): GLib-GObject-WARNING **: cannot register existing type 'GdkDisplayManager'
(SWT:3351): GLib-CRITICAL **: g_once_init_leave: assertion 'result != 0' failed
(SWT:3351): GLib-GObject-CRITICAL **: g_object_new: assertion 'G_TYPE_IS_OBJECT (object_type)' failed
(SWT:3351): GLib-GObject-WARNING **: invalid (NULL) pointer instance
(SWT:3351): GLib-GObject-CRITICAL **: g_signal_connect_data: assertion 'G_TYPE_CHECK_INSTANCE (instance)' failed
(SWT:3351): GLib-GObject-WARNING **: invalid (NULL) pointer instance
(SWT:3351): GLib-GObject-CRITICAL **: g_signal_connect_data: assertion 'G_TYPE_CHECK_INSTANCE (instance)' failed
(SWT:3351): GLib-GObject-WARNING **: cannot register existing type 'GdkDisplay'
(SWT:3351): GLib-CRITICAL **: g_once_init_leave: assertion 'result != 0' failed
(SWT:3351): GLib-GObject-CRITICAL **: g_type_register_static: assertion 'parent_type > 0' failed
(SWT:3351): GLib-CRITICAL **: g_once_init_leave: assertion 'result != 0' failed
(SWT:3351): GLib-GObject-CRITICAL **: g_object_new: assertion 'G_TYPE_IS_OBJECT (object_type)' failed
#
# A fatal error has been detected by the Java Runtime Environment:
#
#  SIGSEGV (0xb) at pc=0x00007f729ae932b7, pid=3351, tid=0x00007f72e24aa700
#
# JRE version: Java(TM) SE Runtime Environment (8.0_111-b14) (build 1.8.0_111-b14)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (25.111-b14 mixed mode linux-amd64 compressed oops)
# Problematic frame:
# C  [libgdk-x11-2.0.so.0+0x4e2b7]  gdk_display_open+0x57
#
Ubuntu 16.04 LTS。在Windows下,应用程序运行良好。 原因可能是什么?我如何解决

PS
一件相当奇怪的事情。当它被打包到Ubuntu外部的jar(在Windows下,以及Linux SWT和jar-in-jar加载器中的jar)时,这个jar开始在Ubuntu下工作,除了文件打开对话框,它只绘制一个空窗口而不是对话框。它以这种方式运行2(两)次。我第三次启动它时,它再次崩溃,并显示相同的消息(
(SWT:3351):GLib GObject WARNING
等)。重新启动Ubuntu并设置'SWT_GTK3=0'不会影响


PPS
Ubuntu在Windows2008下的Hyper-V中运行,如果有关系的话…

在我的情况下,实际上,Baz对这个问题的评论是正确的--
export SWT_GTK3=0
解决了这个问题。我只需要提供它在
Eclipse
(或我的应用程序)启动时起作用——或者在
~/.profile
中设置它,或者从先前设置此变量的bash脚本启动
Eclipse
(或我的应用程序的jar文件)

还有一种更整洁的方法来获得理想的效果。只要SWT代码与应用程序在同一个JVM中执行,就足以在第一次调用SWT之前,在代码的任何一点上以编程方式仅为特定JVM实例设置此变量,无论是作为环境变量还是作为系统属性

在我的代码中,我只需执行以下操作:

  public static void main(String[] args) {
    System.setProperty("SWT_GTK3", "0");
    // now we can use SWT

之后,SWT在Eclipse和JAR文件下都可以正常工作,无需使用bash脚本或自定义用户配置文件

例如,SWT要求在Java本机库中不常见。so@JacekCz你的意思是我应该在Eclipse设置中将这个参数添加到jvm参数中吗?某个地方是path(操作系统路径-不是javapath)应该是swt-xxxxx。so@JacekCz对不起,我是Ubuntu的新手(第一天)。我可以在哪里查找它?在启动应用程序之前,您是否可以尝试将环境变量
SWT_GTK3
设置为
0
?在某些情况下(即,如果希望使用普通滚动条而不是默认的“overlay csrollbars”),SWT(更准确地说,GTK)需要一个以上的环境变量-
LIBOVERLAY_SCROLLBAR=0
。我花了几个晚上的时间来寻找一种从java代码设置它的方法,我发现了: