2017-01-14 3 views
1

Ich versuche, eine SWT-Desktop-Anwendung auf Ubuntu zu portieren. Habe Eclipse Neon (6.4.2) für Ubuntu und swt-4.6.2-gtk-linux-x86_64.zip heruntergeladen, konfigurierte Bibliotheken im Projektbuild-Pfad, um von der heruntergeladenen swt-zip auf die Datei swt.jar zu verweisen.
Eclipse-funktioniert gut, wird die Anwendung kompiliert, sondern stürzt bei dem Versuch, die folgende Zeile des Codes auszuführen:Eine Desktop SWT-Anwendung wird nicht unter Eclipse in Ubuntu

Display display = Display.getDefault(); 

Es ist der erste Aufruf an die SWT im Programm.
Eclipse-schreibt die folgende Meldung auf der Konsole:

(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. Unter Windows funktioniert die Anwendung einwandfrei. Was kann der Grund sein und wie kann ich es beheben?

PS Eine ziemlich seltsame Sache. Wenn es außerhalb des Ubuntu gepackt wird (unter Windows zusammen mit dem Linux SWT und Jar-in-Jar Loader), beginnt dieses Jar unter Ubuntu zu arbeiten, außer dem Datei-Öffnen-Dialog, der nur ein leeres Fenster anstelle des Dialog. Es verhält sich so 2 (zwei) mal. Das dritte Mal, wenn ich es starte, zerquetscht es erneut mit der gleichen Nachricht ((SWT:3351): GLib-GObject-WARNING usw.). Das Neustarten von Ubuntu und das Setzen von `SWT_GTK3 = 0 'haben keine Auswirkungen.

PPS Ubuntu ist in Hyper-V unter Windows2008 läuft, wenn es darauf ankommt ...

+0

SWT erfordert -uncommon in Java - native Bibliothek, zum Beispiel .so –

+0

@JacekCz Meinst du ich sollte diesen Parameter zu den jvm-Argumenten in Eclipse-Einstellungen hinzufügen? –

+0

irgendwo ist Pfad (Betriebssystempfad - nicht javapath) sollte swt-xxxxx.so –

Antwort

1

In meinem Fall tatsächlich, Baz Recht in seinem Kommentar auf die Frage war - export SWT_GTK3=0 löst das Problem. Ich musste nur angeben, dass es einen Effekt hat, wenn Eclipse (oder meine App) startet - entweder in ~/.profile oder starten Sie Eclipse (oder JAR-Datei mit meiner App) von einem Bash-Skript, wo diese Variable zuvor festgelegt wurde.

Und es gibt einen aufgeräumteren Weg, um den gewünschten Effekt zu erzielen. Soweit der SWT-Code in derselben JVM mit der Anwendung ausgeführt wird, ist es ausreichend, diese Variable programmatisch nur für bestimmte JVM-Instanzen zu setzen, entweder als Umgebungsvariable oder als Systemeigenschaft, in jedem Punkt des Codes vor dem eigentlichen Der erste Aufruf an die SWT ist abgeschlossen.

In meinem Code, ich es einfach tun:

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

Danach arbeitet SWT fein sowohl unter Eclipse und von JAR-Datei, ohne dass Bash-Skripte verwenden oder das Benutzerprofil anpassen.

+0

In einigen Fällen (nämlich, wenn Sie normale Bildlaufleisten anstelle von Standard "overlay csrollbars" verwenden möchten) SWT (genauer gesagt, GTK) benötigt eine weitere Umgebungsvariable - 'LIBOVERLAY_SCROLLBAR = 0'.Ich habe ein paar Abende damit verbracht, einen Weg zu finden, um es aus Java-Code zu setzen, und ich habe es gefunden: http://stackoverflow.com/questions/42048599/how-to-disable-overlay-scrollbars-programmatisch- Ubuntu-Java –

Verwandte Themen