Integration von Unity und Java

vorhergehende Artikel in: Java GUI
20.10.2013

Wie ich in meinem Artikel zum Thema Integration von Unity in Python-Programme bereits ausgeführt habe, war mein eigentliches Ziel, Java-Programmen diese Integration angedeihen zu lassen. Daraus wurde eine weite Reise...

Mein erster Versuch, Java-Programme in Unity zu integrieren, war ein ruhmloser Fehlschlag: Ich versuchte mich an der Benutzung der Bibliothek libunity-java aber die stürzte in der Version 0.9 unter Ubuntu 13.04 mit einer Nullpointer-Exception schon bei Ausführen der Methode "isSupported" ab.

Nach genauerer Analyse des Quelltextes stellte ich fest, daß der Haupteintrittspunkt in die Bibliothek unter anderem Dateien ins /tmp-Verzeichnis kopieren wollte. Ein geziehlter Blick offenbarte, daß diese Dateien Python-Skripte waren, die allerdings nicht in der Distribution enthalten waren. Da die Liste der Dateien in einer Properties-Datei gegeben waren, editierte ich diese und löschte alle referenzierten aber nicht vorhandenen Dateien. Danach wurde das Verhalten nicht besser - die Exception kam nun von einer anderen Seite.

Ich gab an diesem Punkt auf - schließlich wollte ich Unity und Java integrieren und nicht java und Python. Abgesehen davon schmeckte mir der Umweg über eine Skriptsprache - so sehr ich ansonsten Python schätze - gar nicht.

Also doch nochmal das Internet befragt - und siehe da - nach langer Suche stieß ich auf einen Artikel, der diese Integration über JNI erklärte. Beim Nachvollziehen des - zugegebenermaßen schon etwas älteren - Artikels stellten sich mir dann aber eine Menge Hürden in den Weg, die der Autor wegen damals anderer Voraussetzungen oder/und Benutzung von Eclipse und/oder ... aufgestellt hatte. Ich werde daher hier den Weg nachvollziehen und zeigen, was man tun sollte, um die Integration vollziehen zu können. Die Quelltexte sind unten an den Artikel angehängt. Es ist keine vollständige Implementierung aller Unity-Features, sondern ein Fundament zum Aufbauen.

Noch rasch ein Wort zu den benutzten Werkzeugen und ihren Versionen: Ubuntu 13.04 war das verwendete Betriebssystem, als C-Compiler kam gcc version 4.7.3 (Ubuntu/Linaro 4.7.3-1ubuntu1) zum Einsatz und das benutzte Java stammte von Oracle: java version "1.7.0_17"

Wichtig ist zunächst die Abwandlung des originalen im Beispiel angegebenen Java-Codes. Das aktuelle javah-Werkzeug nämlich baut so lange Namen der Funktionen, daß sie sich gegebenenfalls aus Sicht des C-Linkers nicht mehr voneinander unterscheiden (der hat nur eine festgelegte signifikante Länge von Symbolnamen). Das passierte mir bei der unreflektierten Übernahme des Beispieles mit den beiden Methoden

public native void unity_launcher_entry_set_progress_visible (long self, boolean visible);
public native void unity_launcher_entry_set_progress (long self, double progress);
Gleich noch ein Wort zum Kompilieren: zwar ist es nach wie vor richtig, daß ein
sudo apt-get install libunity-dev
reicht, um alle benötigten Software-Komponenten zu installieren, allerdings muß man beim Kompilieren etwas variieren: Der letztendlich korrekte Aufruf war:
gcc pkg-config --cflags --libs glib-2.0 pkg-config --cflags --libs dee-1.0 pkg-config --cflags --libs dbusmenu-glib-0.4 -I$JAVA_HOME/include/  -fpic  -c UnityLauncher.c
Das Erstellen der DLL gestaltete sich schon schwieriger: zunächst sah ich die Meldung, daß Symbole nicht gefunden werden konnten. Dann wurde ich durch das Internet und die vielen Ergebnisse zum Thema und den Stichworten JNI und LD_PRELOAD abgelenkt. Viele Leute denken nämlich, daß es ein Problem ist, wenn eine JNI-Bibliothek Symbole aus anderen benötigt. Schließlich aber fiel bei mir der Groschen: um das zu vermeiden, muß man die JNI-DLL einfach mit den von ihr benötigten DLLs zusammen linken:
gcc -shared -o libebunity.so UnityLauncher.o pkg-config --cflags --libs unity
Diese DLL muß man dann in den Pfad legen, in dem Java DLLs sucht und kann sie dann laden:
	System.loadLibrary("ebunity");
Als letzter zu dem Vorbild aus dem Internet hervorzuhebender Umstand sei noch die Tatsache genannt, daß ich nach all diesen Schritten immer noch keine Integration beobachten konnte. Das konnte ich erst, als ich die GMainLoop gestartet hatte. Das muß in einem eigenen Thread geschehen - siehe mitgelieferte Beispiel-Implementierung.

Anschließend lässt sich dann zum Beispiel ein Fortschrittsbalken auf einem der Launcher anzeigen.

Lizenz
Java UnityLauncher
C UnityLauncher

Artikel, die hierher verlinken

Java und Unity Quicklists

23.03.2014

Wie ich in meinem Artikel zum Thema Integration von Unity in Python-Programme bereits ausgeführt habe, war mein eigentliches Ziel, Java-Programmen diese Integration angedeihen zu lassen. Nach dem letzten Etappenziel geht die Reise nun weiter...

Alle Artikel rss Wochenübersicht Monatsübersicht Codeberg Repositories Mastodon Über mich home xmpp


Vor 5 Jahren hier im Blog

  • Multi-User-WebDAV, Docker, GitHub

    17.11.2019

    Nachdem ich mich in letzter Zeit verstärkt mit Docker und dem zugehörigen Ökosystem beschäftige, habe ich begonnen, verschiedenste Dienste in Containern zu testen um zu sehen, ob in manchen Fällen LXC oder KVM nicht doch die bessere Wahl wäre...

    Weiterlesen...

Neueste Artikel

  • Migration der Webseite und aller OpenSource Projekte

    In eigener Sache...

    Weiterlesen...
  • AutoHideToolbar für Java Swing

    Ich habe eine neue Java Swing Komponente erstellt: Es handelt sich um einen Wrapper für von JToolBar abgeleitete Klassen, die die Werkzeugleiste minimieren und sie nur dann einblenden, wenn der Mauszeiger über ihnen schwebt.

    Weiterlesen...
  • Integration von EBMap4D in die sQLshell

    Ich habe bereits in einem früheren Artikel über meine ersten Erfolge berichtet, der sQLshell auf Basis des bestehenden Codes aus dem Projekt EBMap4D eine bessere Integration für Geo-Daten zu spendieren und entsprechende Abfragen, bzw. deren Ergebnisse auf einer Kartenansicht zu visualisieren.

    Weiterlesen...

Manche nennen es Blog, manche Web-Seite - ich schreibe hier hin und wieder über meine Erlebnisse, Rückschläge und Erleuchtungen bei meinen Hobbies.

Wer daran teilhaben und eventuell sogar davon profitieren möchte, muss damit leben, daß ich hin und wieder kleine Ausflüge in Bereiche mache, die nichts mit IT, Administration oder Softwareentwicklung zu tun haben.

Ich wünsche allen Lesern viel Spaß und hin und wieder einen kleinen AHA!-Effekt...

PS: Meine öffentlichen Codeberg-Repositories findet man hier.