Pour mon premier Devoxx, j’ai pu assister à différentes conférences sur le mobile dont « Truly Native Java Apps on iOS with RoboVM » de Niklas Therning, son concepteur.
La création d’applications mobiles nous confronte à la problématique du double développement (Android, iOS). Une solution innovante est apparue : RoboVM. C’est un Framework open-source qui permet de créer des applications natives iOS en Java. Clairement, ce qui est visé est la réutilisation du code Android pour iOS. Il n’y a pas d’intérêt à utiliser directement RoboVM pour une app iOS seule.
Les applications sur le marché faites à l’aide de RoboVM sont pour l’instant principalement des jeux.
En cherchant un peu, on se rend compte que dans la grande majorité des cas, elles utilisent RoboVM via libGDX (cf. Alternatives).
Comment ça marche ?
RoboVM traduit directement le bytecode Java (.class) en code natif ARM ou x86, les applications tournent directement sur le CPU sans interpréteur.
Pour fonctionner, il est nécessaire d’avoir un Mac sous Mac OS X 10.9 et Xcode 5.x (l’auteur travaille à ce que cela marche sur d’autres OS). L’application se lance en ligne de commande ou grâce au plugin Eclipse sur un simulateur ou un appareil.
A titre d’exemple, la compilation (.ipa) d’une application HelloWorld pour iOS nécessite de traduire environ 2000 classes avec un temps réel d’exécution d’un peu plus de 2 minutes la première fois, puis 7 secondes grâce à la mise en cache des classes traduites. La taille de l’application générée est de 4 Mo.
Les classes standards traduites (java.lang., java.util., etc.) par RoboVM sont basées sur la VM par défaut d’Android, Dalvik.
Il existe un pont Java vers Objective-C qui permet d’utiliser l’API native iOS CocoaTouch directement en Java. L’interface utilisateur se développe alors programmatiquement. On peut suivre son statut ici.
Exemple de création et affichage d’un bouton :
UIButton button = UIButton.create(UIButtonType.RoundedRect);
button.setTitle(« myText» ,UIControlState.Normal);
button.setFrame(new CGRect(115.0f, 121.0f, 91.0f, 37.0f));
UIWindow window = new UIWindow(UIScreen.getMainScreen().getBounds());
window.setBackgroundColor(UIColor.colorWhite());
window.addSubview(prompt);
window.makeKeyAndVisible();
RoboVM Button in Java for iOS Même si le Google Groupe est assez actif (avec l’auteur du Framework), il ne faut pas avoir peur de mettre les mains dans le cambouis car, sans documentation, l’affaire devient vite compliquée.
Les avantages et inconvénients
Avantages :
- Réutilisation de bibliothèques (.jar) sans avoir besoin du code source (contrairement à J2objC).
- Plugin Eclipse
Inconvénients :
- Manque de documentation dû à la jeunesse de RoboVM
- L’interface graphique doit être codée sans l’aide d’un outil graphique.
- Toutes les fonctionnalités de CocoaTouch ne sont pas encore traduites.
- Performances à la première compilation.
Les alternatives
- J2objC est un outil open source de Google qui traduit le Java en Objective-C. Le principe est d’utiliser un même modèle en Java pour les 2 plateformes Android et iOS alors que les 2 UIs seront faites dans leur langage respectif.
J2objC ne traduit que le code source (.java), le Java bytecode (.jar et .class) n’est pas traduit.
- CodenameOne permet à l’aide d’un seul outil de coder en Java pour iOS, Android, Windows, etc. Une interface graphique permet de développer facilement les vues. Malheureusement CodenameOne n’est pas gratuit.
- libGDX est un Framework Java de développement de jeux multi-platformes (Windows, Mac, Linux, Android, iOS, BlackBerry et HTML5), qui pour la plate-forme iOS utilise RoboVM.
Sa documentation et ses exemples sont un atout mais libGDX reste fondamentalement tourné vers les jeux.
Conclusion
RoboVM est une solution innovante pour le développement d’applications multi-platformes. Cependant, le manque de documentation freine drastiquement sa facilité d’utilisation. Il reste néanmoins intéressant de rester attentif à son évolution.
Le site du projet: http://www.robovm.org
Un article relatif : http://www.javaworld.com/article/2078740/java-ios-developer/open-source-java-ios-tools-compared.html