Da auf Android Anwendungen in Java geschrieben werden, ist das kompilieren von Mana Mobile für Android etwas komplizierter. Schließlich handelt es sich um eine in Qt (und C++) geschriebene Anwendung. Diese Anleitung bezieht sich dabei auf einen Kubuntu 10.10 Rechner. Zuerst muss das entsprechende Qt SDK für Android unter http://sourceforge.net/projects/necessitas/files/ heruntergeladen werden.
Nach dem Download muss der Installer mittels:
chmod +x necessitas-0.1.1-Linux-x86-Install
ausführbar gemacht werden. Dann kann der Installer gestartet werden. Installiert werden sollte das ganze in den Ordner /opt/necessitas/ da dieser vom Entwicklerteam von Necessitas intensiv getestet wurde.
Nun müssen noch das Android SDK sowie das Android NDK installiert werden. Das SDK kann dabei unter http://developer.android.com/sdk/index.html bezogen werden. Nach dem Download des selben wird das SDK entpackt und an eine gewünschte Stelle gelegt. Anschließend geht man dort in den Ordner tools und führt im Terminal
./android update sdk
aus. Dadurch wird das SDK geupdatet. Nun muss nur noch das NDK (zu finden unter http://developer.android.com/sdk/ndk/index.html) herunter geladen werden und an gewünschter Stelle entpackt werden. Bei beiden Developer Kits ist dabei zu achten die jeweils richtige Version (in diesem Fall die Linux Version) herunterzuladen.
Nun kann der Qt Creator for Android gestartet werden. Der Installer hat dazu im Desktop Ordner (im Home Verzeichnis) ein Shortcut angelegt. Nach dem Start der IDE öffnet man die Optionen (Tools -> Options) und geht dort auf den Qt4 Tab. Dort wird bei der Android für QT Version der Pfad für qmake eingetragen (/opt/necessitas/Android/“qtversion“/bin/qmake). Dieser QT Version muss dann noch ein Name zugewiesen werden z.B. android-lighthouse-4.8.0.
Als nächstes wechselt man zu dem Android Tab. Dort wird dann der Pfad zum Android SDK (Minimum android-sdk_r09) und zum Android NDK (Minimum android-ndk_r5) gesetzt. Nun muss der korrekte Toolchain gesetzt werden, in diesem Fall arm-linux-androideabi-4.4.3. Als letztes muss der Pfad für ant gesetzt werden welcher meist /usr/bin/ant sein sollte.
Nun geht man nochmal auf den Qt4 Tab und klickt dort auf Build all, damit alle wichtigen Tools gebaut werden. Anschließend kann der Dialog mit einem Klick auf Apply & OK verlassen werden.
Nun kann es an die Einrichtung von Mana Mobile gehen. Im ersten Schritt sollte das Projekt aus den SVN ausgecheckt werden. Dies funktioniert mittels:
svn checkout https://invertika.googlecode.com/svn/trunk/client-mobile/ invertika
In diesem Projekt befindet sich eine .pro Datei welche mit dem Qt Creator geöffnet werden kann. Beim öffnen fragt der Qt Creator welche Buildziele man compieren möchte. Hier wählt man die Androidvarianten mit an und bestätigt das ganze mit dem Finish Button. Dann kann man das ganze testweise mit dem Build All Button kompilieren. Dabei dürfte es an zwei Stellen zu Problemen kommen. Die erste Stelle ist die Funktion setOrientation (in der Datei qmlapplicationviewer.cpp):
case ScreenOrientationLockPortrait: //attribute = Qt::WA_LockPortraitOrientation; break; case ScreenOrientationLockLandscape: //attribute = Qt::WA_LockLandscapeOrientation; break; default: case ScreenOrientationAuto: //attribute = Qt::WA_AutoOrientation; break;
Dort müssen die Zuweisungen des Attributes auskommentiert werden. Anschließend dürfte ein Fehler in der Bibliothek enet (enet_address_get_host in der Datei unix.c) auftreten:
#if defined(linux) || defined(__linux) || defined(__linux__) || defined(__FreeBSD__) || defined(__FreeBSD_kernel__) //gethostbyaddr_r ((char *) & in, sizeof (struct in_addr), AF_INET, & hostData, buffer, sizeof (buffer), & hostEntry, & errnum); #else hostEntry = gethostbyaddr_r ((char *) & in, sizeof (struct in_addr), AF_INET, & hostData, buffer, sizeof (buffer), & errnum); #endif #else in.s_addr = address -> host; hostEntry = gethostbyaddr ((char *) & in, sizeof (struct in_addr), AF_INET); #endif
Hier wird dann der Funktionsaufruf gethostbyaddr auskommentiert. Danach sollte das ganz kompilieren. Wenn man dann auf den Run Button drückt liefert ant noch eine Fehlermeldung:
BUILD FAILED
/home//android-sdk-linux_x86/tools/ant/main_rules.xml:306: null returned: 1 Total time: 0 seconds
Packaging Error: Command ‚/usr/bin/ant debug‘ failed.Exit code: 1
Error while building project manamobile (target: Android)
When executing build step ‚Packaging for Android‘
Hier hilft es die minimale SDK Version von android-3 auf android-4 anzuheben. Dazu geht man auf den Tab Projects und dort auf die Run Konfiguration des Androidprojektes. Dort kann man diese Einstellungen dann vornehmen.
Da die OpenGL Bindings für die Android Qt Version noch nicht lauffähig sind muss in der Manamobile.pro die Zeile contains(QT_CONFIG, opengl): QT += opengl auskommentiert werden:
QT += network #contains(QT_CONFIG, opengl): QT += opengl
In der main.cpp müssen folgende Zeilen auskommentiert werden:
#ifndef QT_NO_OPENGL //#include#endif #ifndef QT_NO_OPENGL //viewer.setViewport(new QGLWidget); #endif
Außerdem muss noch die Zeile:
viewer.setMainQmlFile(QLatin1String("qml/main/mobile.qml"));
in
viewer.setMainQmlFile(QLatin1String("/sdcard/qml/main/mobile.qml"));
abgeändert werden. Der qml Ordner sollte dem entsprechend dann auch auf der SD Karte liegen. Eventuell kann es zu Problemen kommen, wenn bei der Anwendung die falschen bzw. ungenügende Rechte im Manifest gesetzt sind. Normalerweise werden für Mana Mobile folgende Rechte benötigt:
– android.permission.INTERNET
– android.permission.WRITE_EXTERNAL_STORAGE
Ein anderes Problem könnte auftreten wenn nicht alle benötigten Qt Bibliotheken in den Projekteinstellungen aktiviert sind. Dazu geht man in die Projekteigenschaften unter Android -> Run -> Package Configuration -> Libraries und klickt dort auf den Button Read informations from application. Nun muss aus dem Market nur noch Ministro (stellt die OpenGL Bindings unter Android bereit) heruntergeladen werden. Danach sollte Manamobile auf einem Androidgerät laufen. Dabei kommt es im Moment noch zu Einschränkungen, so werden Touchevents noch nicht richtig verarbeitet.