桌面SWT应用程序不能在Ubuntu中运行Eclipse

时间:2017-01-14 18:56:03

标签: java eclipse ubuntu gtk swt

我试图将SWT桌面应用程序移植到Ubuntu。已经为Ubuntu和Eclipse Neon (6.4.2)下载了swt-4.6.2-gtk-linux-x86_64.zip,项目构建路径中已配置的库指向下载的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开始在Ubuntu下工作,执行文件打开对话框,只绘制一个空窗口而不是对话。它的行为方式为2(两)次。我第三次启动它时会再次使用相同的消息((SWT:3351): GLib-GObject-WARNING等)进行压缩。重启Ubuntu并设置`SWT_GTK3 = 0'没有影响。

PPS如果重要的话,Ubuntu在Windows2008下的Hyper-V中运行......

1 个答案:

答案 0 :(得分:1)

就我而言,实际上,Baz对这个问题的评论是正确的 - export SWT_GTK3=0解决了这个问题。我必须提供它在Eclipse(或我的应用程序)启动时产生的效果 - 在~/.profile中设置它或从{app}启动Eclipse(或使用我的应用程序的jar文件) bash脚本,此变量先前已设置。

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

在我的代码中,我只是这样做:

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

之后,SWT在Eclipse和JAR文件下运行良好,无需使用bash脚本或自定义用户配置文件。