我试图将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中运行......
答案 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脚本或自定义用户配置文件。