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 Github Repositories Gitlab Repositories Mastodon Über mich home xmpp


Vor 5 Jahren hier im Blog

  • Certstream, InfluxDB, Grafana und Netflix

    16.04.2019

    Nachdem ich vor kurzem über mein erstes Spielen mit dem certstream berichtete, habe ich weitere Experimente gemacht und die Daten zur besseren Auswertung in eine InfluxDB gepackt, um sie mit Grafana untersuchen zu können.

    Weiterlesen...

Neueste Artikel

  • Die sQLshell ist nun cloudnative!

    Die sQLshell hat eine weitere Integration erfahren - obwohl ich eigentlich selber nicht viel dazu tun musste: Es existiert ein Projekt/Produkt namens steampipe, dessen Slogan ist select * from cloud; - Im Prinzip eine Wrapperschicht um diverse (laut Eigenwerbung mehr als 140) (cloud) data sources.

    Weiterlesen...
  • LinkCollections 2024 III

    Nach der letzten losen Zusammenstellung (für mich) interessanter Links aus den Tiefen des Internet von 2024 folgt hier gleich die nächste:

    Weiterlesen...
  • Funktionen mit mehreren Rückgabewerten in Java

    Da ich seit nunmehr einem Jahr bei meinem neeun Arbeitgeber beschäftigt und damit seit ungefähr derselben Zeit für Geld mit Python arbeite, haben sich gewisse Antipathien gegenüber Python vertieft (ich kann mit typlosen Sprachen einfach nicht umgehen) - aber auch einige meiner Gründe, Python zu lieben sind ebenso stärker geworden. Einer davon ist der Fakt, dass eine Methode in Python mehr als einen Wert zurückgeben kann.

    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, muß 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 GitHub-Repositories findet man hier - meine öffentlichen GitLab-Repositories finden sich dagegen hier.