Standalone SWT-Application als jar mit JNI-Klassen in FreeBSD erstellen

klimaschreck

Well-Known Member
Hallo zusammen,

ich möchte gerne zunächst ein kleines Java-Programm mit SWT-GUI erstellen, das ohne eclipse ausgeführt werden soll. Mit eclipse läuft es. Zudem will ich es als jar starten, da ich vorhabe, ein Programm mit weiteren Klassen zu erstellen. Wenn es schon mit einer Klasse nicht klappt, wird es auch mit mehreren Klassen nicht funktionieren.

Die Datei HelloWorld.java kann ich übersetzen und auch eine jar-Datei erzeugen.

Wenn ich nun den folgenden Aufruf starte, erhalte ich diese Fehlermeldung:

Code:
java -jar example.jar
Exception in thread "main" java.lang.UnsatisfiedLinkError: no swt-pi-gtk-3236 in java.library.path
        at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1682)
        at java.lang.Runtime.loadLibrary0(Runtime.java:822)
        at java.lang.System.loadLibrary(System.java:992)
        at org.eclipse.swt.internal.Library.loadLibrary(Library.java:123)
        at org.eclipse.swt.internal.gtk.OS.<clinit>(OS.java:22)
        at org.eclipse.swt.internal.Converter.wcsToMbcs(Converter.java:63)
        at org.eclipse.swt.internal.Converter.wcsToMbcs(Converter.java:54)
        at org.eclipse.swt.widgets.Display.<clinit>(Display.java:126)
        at HelloWorld.main(HelloWorld.java:10)

Es werden offensichtlich die GTK-libs nicht gefunden. Wenn ich dagegen den Aufruf abändere in

Code:
java -Djava.library.path=/tmp/swt-libs -jar example.jar

funktioniert es.

Im Verzeichnis sind diese libs enthalten:

Code:
libswt-atk-gtk-3236.so
libswt-awt-gtk-3236.so
libswt-cairo-gtk-3236.so
libswt-glx-gtk-3236.so
libswt-gnome-gtk-3236.so
libswt-gtk-3236.so
libswt-mozilla-gtk-3236.so
libswt-pi-gtk-3236.so

Diese Lösung funktioniert zwar, ist aber sehr umständlich. Besser wäre es natürlich, die Dateien auch in das JAR reinzupacken, damit ich nur noch eine Datei habe. Ich habe z.B. ein Archiv org.eclipse.swt.gtk.freebsd.x86_3.2.2.v3236.jar in dem alles drin steckt. Wenn ich dies in mein neues JAR packe, findet er keine Dateien mehr. Ich weiß auch nicht genau, wie ich im Manifest darauf verweisen sollte. Ich hatte "Class-Path: org.eclipse.swt.gtk.freebsd.x86_3.2.2.v3236.jar" hinzugefügt. Vielleicht war das auch falsch.

Habt ihr eine Idee, wie es klappen könnte?

Viele Grüße

Rainer
 
Habt ihr eine Idee, wie es klappen könnte?
Ja. Swing einsetzen. :)

Siehe auch: http://www.ibm.com/developerworks/grid/library/os-swingswt/

Conclusion

This article provided a comparison between the Eclipse's Standard Windows Toolkit with JFace, and the Java's Swing and Abstract Windows Toolkit GUI tool kits. Through the comparisons provided here, you can decide which GUI tool kit to use for your new applications.

In most cases, the decision is between Swing and SWT combined with JFace. In general, each of these tool kits is complete and powerful enough to build full-function GUIs, but Swing is generally superior to SWT alone (used without JFace). Swing has the advantage of being built into Java technology, is completely portable, and arguably has a better architecture. Swing also has the advantage for advanced graphical applications. SWT has the advantage of being implemented as a native application which increases the performance and native compatibility of SWT-based GUIs.

If you are developing only for one platform, SWT has an advantage in host compatibility, including integration with host features, such as use of ActiveX controls under Windows.

Ich versteh immer noch nicht, wieso man überhaupt Programme in Java schreibt, wenn man die Plattform-Unabhängigkeit dann doch wieder mit SWT aufgibt. Dann kann man auch gleich auf Java verzichten.
 
Zuletzt bearbeitet:
Pack doch einfach die Libs direkt in dein JAR. Das sollte auf jeden Fall funktionieren.

JARs in ein anderes JAR einpacken geht nur mit irgendeinem bestimmten Trick, den ich aber nicht kenne. Von Java halte ich mich nach Möglichkeit fern. Google sollte aber wahrscheinlich mehr dazu wissen.
 
Hallo Kamikaze,

also eigentlich sehe ich das so wie Endorphine, was Du beschreibst ist ein Eclipse spezifisches Problem da IBM mit Eclipse eigentlich die Plattform-Unabhängigkeit aufgab und SWT was Konzepte von C++ nutzt einführte.

Du hast auch schon ein weiteres Problem selbst benannt die Manifest Datei überhaupt in Eclipse ist ein Projekt auch ganz amders aufgebaut als in NetBeans.

Ich würde Dir zu NetBeans raten da Du hier standardgemäss arbeitest und keinerlei Probleme wie in Deinem genannten Beispiel auftreten werden.

Wenn es schon ein verkapptes C++ Programm sein soll ( Du musst ja in SWT Speicher explizit freigeben ) dann kannst Du Dir auch gleich ein Programm in C++ erstellen.

Was nun die Jars angeht Eclipse hält sich da auch nicht an Programmier Standards. So wirst Du selbst wenn Du Swing mit Eclipse verwendest dann Probleme unter anderen Java - Entwicklungsumgebungen haben.

Also wenn Du Dir das Leben wesentlich erleichtern willst rate ich Dir zu NetBeans und die aktuelle Version 6.0 ist draussen.

Wenn Du dann lieber C++ den Vorzug geben möchtest kannst Du das auch mit NetBeans gut realisieren.

Gruss der rudy
 
Zurück
Oben