© Excellent backgrounds/Shutterstock.com
iOS-Applikation mit RoboVM erstellen

Die Bohne im Apfel


Wer als Java-Entwickler in die iOS-Welt eintaucht, fühlt sich dort nicht ganz wohl. Es beginnt mit den Programmiersprachen. Objective-C erscheint sehr archaisch, für Swift hingegen bekommt man aufgrund der relativen Neuheit kaum Literatur. Aber nicht nur das notwendige Erlernen einer neuen Programmiersprache erschwert den Einstieg. Genauso, wenn nicht sogar schwerwiegender, erweist sich das Problem der fehlenden Bibliotheken. Auch die zwingend notwendige IDE Xcode ist recht eigen in der Benutzung, und die Refactoring-Werkzeuge sind sehr dürftig und funktionieren aktuell nur innerhalb von Objective-C-Projekten.

Es wurden bereits einige Anläufe unternommen, Java auch auf Apples mobilen Geräten für den Programmierer zur Verfügung zu stellen. Fast alle scheiterten sie an Apples Richtlinien, die nur Objective-C, Swift und JavaScript unter iOS zulassen. Eine rettende Idee kam 2007 der sich auf dotNet-Portierungen spezialisierenden Firma Xamarin. Wenn das Programm im Binärcode vorliegt, kann seitens Apple nicht mehr erkannt werden, ob es sich hierbei um eine aus Objective-C, Swift oder einer anderen Programmiersprache hervorgegangenen App handelt. Da aber bei .NET ähnlich wie bei Java die Deployments aus Bytecode bestehen, die erst auf der Zielmaschine während der Ausführung übersetzt werden, kam man auf die Idee, den Übersetzungsvorgang bereits vor den Zeitpunkt des Zusammenbaus der fertigen App zu verschieben. Exakt den gleichen Weg haben die Entwickler von RoboVM gewählt. Auch hier übersetzt der vorverlagerte Compiler die Java-Klassen der Anwendung und der notwenigen Bibliotheken. Zuvor geht ein spezielles, Tree Shaker genanntes, Tool über den Bytecode und entfernt dort nicht benutzte Methoden, damit die Ergebnis-App möglichst schlank wird.

Wie kann man’s essen?

RoboVM setzt auf bewährten Komponenten auf. Als IDE wird der Standard in der Java-Welt verwendet – Eclipse. Das Erstellen der App wird wahlweise über ein Ant-Skript, Maven aber auch Gradle gesteuert. Im Normalfall ist das Plug-in nach der Installation ohne weitere Konfiguration einsatzfähig. Seit der Version 1.5 erhielt auch die Integration in JetBrains IDEA den Releasestatus. Dieses Tutorial beschäftigt sich allerdings mit dem Eclipse-Plug-in.

Messer und Gabel: Voraussetzungen

Um RoboVM zu benutzen, benötigt der geneigte Benutzer einen Apple-Rechner mit einem aktuellen Betriebssystem, also OS X Yosemite (10.10). Die Betaversion von ElCaptain (10.11) würde ich nicht empfehlen, da dort aufgrund diverser, neu hinzugekommener Einschränkungen gerade Entwicklungstools von Fremdherstellern mit großen Problemen kämpfen müssen. Zum Zeitpunkt des Erscheinens des Artikels sollte allerdings bereits ElCaptain den Releasestatus erreicht haben und eine entsprechend passende RoboVM-Version erschienen sein.

Des Weiteren muss der Entwickler eine aktuelle Version von Xcode (min. 6.0) auf seinem Mac installiert haben. Diese gibt es kostenlos im App Store zum Download. Will man allerdings die fertige App auch auf dem eigenen Gerät (respektive auch auf 99 weiteren) ausprobieren, benötigt man derzeit einen bezahlten Apple-Entwickleraccount, der 99 Euro im Jahr kostet. Ab der Version 7.0 von Xcode, die derzeit als Betaversion von Entwicklern heruntergeladen werden kann, wird es möglich sein, auch ohne Developer-Account die entwickelte App auf ein an den Entwicklercomputer angeschlossenes Apple-Gerät zu installieren. Sollten mehrere Xcode-Versionen auf dem Rechner installiert sein, kann man mithilfe des folgenden Terminalbefehls die gewünschte Version als Standard hinterlegen:

sudo xcode-select -switch /Applications/<xcode-version>.app

Da RoboVM auf Java aufbaut, wird eine aktuelle Java-Version (7 oder 8) benötigt. Diese kann auf der Oracle-Java-Downloadseite heruntergeladen werden. Apple selbst, bis vor einiger Zeit alleiniger Lieferant von angepassten Java-Distributionen für Macs, bietet nur noch eine 6er-Version zum Download an. Diese reicht für RoboVM nicht aus.

Da sich dieser Artikel mit der Plug-in-Version von RoboVM beschäftigt, wird zusätzlich Eclipse für Java SE (Luna oder Mars) benötigt. In Eclipse selbst muss das JDK in der Version 7 oder 8 unter „Preferences – Instand JREs“ vorhanden und ausgewählt sein.

Zubereitung/Installation

Da RoboVM ein Plug-in ist, wird es ausschließlich und komplett über den „Install New Software“-Dialog installiert. Der Installations-URL lautet http://download.robovm.org/eclipse/. Für ganz mutige stehen auch Nightly Builds unter dem URL http://download.robovm.org/nightlies/eclipse/ zur Verfügung. Genauso werden auch die Updates über den Updatemechanismus von Eclipse durchgeführt. Nachdem die Software installiert und Eclipse neu gestartet wurde, findet man einen neuen Menüpunkt mit der Bezeichnung „Robo-VM“. Unter dem Punkt finden wir den Lizenzmanager, in dem wir eine gültige Lizenz eintragen können. Ohne Lizenzeingabe können wir die Free-Version nutzen, deren Einschränkungen das Fehlen der Zeilenbezüge während des Debuggens und die nicht vorhandene Integration des Interface-Builders sind. Alle bezahlten Versionen beinhalten eine vierzehntägige Probeperiode, in der man den Vertrag ohne Angabe von Gründen problemlos kündigen kann.

Das erste Gericht

Als kleines Beispielprojekt werden wir eine kleine Rechner-App schreiben, die auf zwei vorgegebenen Zahlen verschiedene Berechnungen ausführen kann. Ich gehe von der lizensierten Version aus, da die Integration des Interface-Builders nur dort freigeschaltet ist. Die Integration kommt mit einer Codegenerierung im Hintergrund daher, erspart einiges an manueller Arbeit und schließt damit einige Fehlerquellen von vornherein aus.

Wir beginnen, wie unter Eclipse üblich, mit einem neuen Projekt. File | New | Project… bringt uns zum Auswahldialog, bei dem wir in der Gruppe „Robo-VM“ „Robo-VM iOS-Project“ auswählen.

cichon_robovm_5.tif_fmt1.jpgAbb. 1: Dialog zum Anlegen einer neuen RoboVM-Anwendung
cichon_robovm_6.tif_fmt1.jpgAbb. 2: Projektstruktur unseres Projekts

Listing 1

package de.cichon.minicalc; import org.robovm.apple.foundation.NSAutoreleasePool; import org.robovm.apple.uikit.UIApplication; import org.robovm.apple.uikit.UIApplicationDelegateAdapter; import org.robovm.apple.uikit.UIApplicationLaunchOptions; public class Calc extends UIApplicationDelegateAdapter { @Override public boolean didFinishLaunching(UIApplication application, UIApplicationLaunchOptions launchOptions) { return true; } public static void main(String[] args) { try (NSAutoreleasePool pool = new NSAutoreleasePool()) { UIApplication.main(args, null, Calc.class); } } }

Außer der Startklasse sieht man in der aufgeklappten Projektstruktur eine weitere Java-Klasse mit dem Namen MyViewController (Listing 2). Ein View Controller ist die Implementierung des Verhaltens einer View, die sowohl ein Steuerelem...

Neugierig geworden? Wir haben diese Angebote für dich:

Angebote für Gewinner-Teams

Wir bieten Lizenz-Lösungen für Teams jeder Größe: Finden Sie heraus, welche Lösung am besten zu Ihnen passt.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang