seeseekey.net - Invictus Deus Ex Machina

Da auf Android Anwen­dun­gen in Java geschrie­ben wer­den, ist das kom­pi­lie­ren von Mana Mobile für Android etwas kom­pli­zier­ter. Schließ­lich han­delt es sich um eine in Qt (und C++) geschrie­bene Anwen­dung. Diese Anlei­tung bezieht sich dabei auf einen Kubuntu 10.10 Rech­ner. Zuerst muss das ent­spre­chende Qt SDK für Android unter http://sourceforge.net/projects/necessitas/files/ her­un­ter­ge­la­den werden.

Nach dem Down­load muss der Instal­ler mit­tels:

chmod +x necessitas-0.1.1-Linux-x86-Install

aus­führ­bar gemacht wer­den. Dann kann der Instal­ler gestar­tet wer­den. Instal­liert wer­den sollte das ganze in den Ord­ner /opt/necessitas/ da die­ser vom Ent­wick­ler­team von Neces­si­tas inten­siv getes­tet wurde.

Nun müs­sen noch das Android SDK sowie das Android NDK instal­liert wer­den. Das SDK kann dabei unter http://developer.android.com/sdk/index.html bezo­gen wer­den. Nach dem Down­load des sel­ben wird das SDK ent­packt und an eine gewünschte Stelle gelegt. Anschlie­ßend geht man dort in den Ord­ner tools und führt im Ter­mi­nal

./android update sdk

aus. Dadurch wird das SDK geup­datet. Nun muss nur noch das NDK (zu fin­den unter http://developer.android.com/sdk/ndk/index.html) her­un­ter gela­den wer­den und an gewünsch­ter Stelle ent­packt wer­den. Bei bei­den Deve­l­oper Kits ist dabei zu ach­ten die jeweils rich­tige Ver­sion (in die­sem Fall die Linux Ver­sion) herunterzuladen.

Nun kann der Qt Crea­tor for Android gestar­tet wer­den. Der Instal­ler hat dazu im Desk­top Ord­ner (im Home Ver­zeich­nis) ein Short­cut ange­legt. Nach dem Start der IDE öff­net man die Optio­nen (Tools -> Opti­ons) und geht dort auf den Qt4 Tab. Dort wird bei der Android für QT Ver­sion der Pfad für qmake ein­ge­tra­gen (/opt/necessitas/Android/„qtversion“/bin/qmake). Die­ser QT Ver­sion muss dann noch ein Name zuge­wie­sen wer­den z.B. android-lighthouse-4.8.0.

Als nächs­tes wech­selt man zu dem Android Tab. Dort wird dann der Pfad zum Android SDK (Mini­mum android-sdk_r09) und zum Android NDK (Mini­mum android-ndk_r5) gesetzt. Nun muss der kor­rekte Tool­chain gesetzt wer­den, in die­sem Fall arm-linux-androideabi-4.4.3. Als letz­tes muss der Pfad für ant gesetzt wer­den wel­cher meist /usr/bin/ant sein sollte.

Nun geht man noch­mal auf den Qt4 Tab und klickt dort auf Build all, damit alle wich­ti­gen Tools gebaut wer­den. Anschlie­ßend kann der Dia­log mit einem Klick auf Apply & OK ver­las­sen werden.

Nun kann es an die Ein­rich­tung von Mana Mobile gehen. Im ers­ten Schritt sollte das Pro­jekt aus den SVN aus­ge­checkt wer­den. Dies funk­tio­niert mit­tels:

svn check­out https://invertika.googlecode.com/svn/trunk/client-mobile/ invertika

In die­sem Pro­jekt befin­det sich eine .pro Datei wel­che mit dem Qt Crea­tor geöff­net wer­den kann. Beim öff­nen fragt der Qt Crea­tor wel­che Build­ziele man com­pie­ren möchte. Hier wählt man die Andro­id­va­ri­an­ten mit an und bestä­tigt das ganze mit dem Finish But­ton. Dann kann man das ganze test­weise mit dem Build All But­ton kom­pi­lie­ren. Dabei dürfte es an zwei Stel­len zu Pro­ble­men kom­men. Die erste Stelle ist die Funk­tion setO­ri­en­ta­tion (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üs­sen die Zuwei­sun­gen des Attri­bu­tes aus­kom­men­tiert wer­den. Anschlie­ßend dürfte ein Feh­ler in der Biblio­thek 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 Funk­ti­ons­auf­ruf gethost­byaddr aus­kom­men­tiert. Danach sollte das ganz kom­pi­lie­ren. Wenn man dann auf den Run But­ton drückt lie­fert ant noch eine Feh­ler­mel­dung:

BUILD FAILED
/home//android-sdk-linux_x86/tools/ant/main_rules.xml:306: null retur­ned: 1

Total time: 0 seconds
Packa­ging Error: Com­mand ‚/usr/bin/ant debug‘ failed.Exit code: 1
Error while buil­ding pro­ject mana­mo­bile (tar­get: Android)
When exe­cu­ting build step ‚Packa­ging for Android’

Hier hilft es die mini­male SDK Ver­sion von android-3 auf android-4 anzu­he­ben. Dazu geht man auf den Tab Pro­jects und dort auf die Run Kon­fi­gu­ra­tion des Andro­id­pro­jek­tes. Dort kann man diese Ein­stel­lun­gen dann vornehmen.

Da die OpenGL Bin­dings für die Android Qt Ver­sion noch nicht lauf­fä­hig sind muss in der Manamobile.pro die Zeile contains(QT_CONFIG, opengl): QT += opengl aus­kom­men­tiert werden:

    QT += network
    #contains(QT_CONFIG, opengl): QT += opengl

In der main.cpp müs­sen fol­gende Zei­len aus­kom­men­tiert werden:

    #ifndef QT_NO_OPENGL
    //#include 
    #endif
 
    #ifndef QT_NO_OPENGL
       //viewer.setViewport(new QGLWidget);
    #endif

Außer­dem muss noch die Zeile:

    viewer.setMainQmlFile(QLatin1String("qml/main/mobile.qml"));

in

    viewer.setMainQmlFile(QLatin1String("/sdcard/qml/main/mobile.qml"));

abge­än­dert wer­den. Der qml Ord­ner sollte dem ent­spre­chend dann auch auf der SD Karte lie­gen. Even­tu­ell kann es zu Pro­ble­men kom­men, wenn bei der Anwen­dung die fal­schen bzw. unge­nü­gende Rechte im Mani­fest gesetzt sind. Nor­ma­ler­weise wer­den für Mana Mobile fol­gende Rechte benötigt:

- android.permission.INTERNET
- android.permission.WRITE_EXTERNAL_STORAGE

Ein ande­res Pro­blem könnte auf­tre­ten wenn nicht alle benö­tig­ten Qt Biblio­the­ken in den Pro­jekt­ein­stel­lun­gen akti­viert sind. Dazu geht man in die Pro­jekt­ei­gen­schaf­ten unter Android -> Run -> Package Con­fi­gu­ra­tion -> Libra­ries und klickt dort auf den But­ton Read infor­ma­ti­ons from app­li­ca­tion. Nun muss aus dem Mar­ket nur noch Minis­tro (stellt die OpenGL Bin­dings unter Android bereit) her­un­ter­ge­la­den wer­den. Danach sollte Mana­mo­bile auf einem Andro­id­ge­rät lau­fen. Dabei kommt es im Moment noch zu Ein­schrän­kun­gen, so wer­den Tou­chevents noch nicht rich­tig verarbeitet.

Möchte man den But­ton für die Kon­text­hilfe in Qt Fens­tern aus­blen­den so reicht für das ent­spre­chende Fens­ter im Kon­struk­tor fol­gen­des zu schreiben:

FormProgress::FormProgress(QWidget *parent) : QDialog(parent)
{
  setupUi(this);

  //WindowsFlags
  setWindowFlags(windowFlags() & (~(Qt::WindowContextHelpButtonHint)));
}

Und schon ist der ent­spre­chende But­ton in der Titel­leiste weg :)

Wer mit Qt pro­gram­mie­ren möchte der braucht natür­lich Doku­men­ta­tion. Dort ist die erste Anlauf­stelle die offi­zi­elle Doku­men­ta­tion wel­che unter http://doc.qt.nokia.com/ zu fin­den ist. Einen schö­nen Arti­kel zu die­sem Thema gibt es auch von Pro Linux unter http://www.pro-linux.de/artikel/2/1097/entwicklung-von-applikationen-in-qt-40.html sowie unter http://www.pro-linux.de/artikel/2/1098/entwicklung-von-applikationen-in-qt-40-teil-2.html. Wer das ganze in Buch­form haben möchte sollte sich die­ses Buch hier anschauen. Es ist zwar schon etwas älter bie­tet aber eine fun­dierte Ein­füh­rung in Qt und ist auch preis­lich in Ordnung.

Wei­tere Infor­ma­tio­nen gibt es unter:
http://de.wikipedia.org/wiki/Qt

Möchte man im Qt Desi­gner ein QGL­Wid­get für OpenGL in den Dia­log ein­set­zen so wird man fest­stel­len das kei­nes exis­tiert. Darum setzt man zunächst ein Wid­get in das For­mu­lar. Anschlie­ßend klickt man mit der rech­ten Maus­taste auf das For­mu­lar und wählt dort Pro­mote to… aus. Anschlie­ßend öff­net sich fol­gen­der Dialog:

Dort gibt man dann bei Pro­mo­ted class name QGL­Wid­get (das Hea­der File wird auto­ma­tisch ein­ge­tra­gen) ein und drückt anschlie­ßend auf Add und been­det den Dia­log mit Pro­mote. Schon hat man das ent­spre­chende Wid­get im Qt Desi­gner angelegt.

Möchte man das Qt Frame­work und Visual Stu­dio benut­zen so sollte man sich das ent­spre­chende Addin unter http://qt.nokia.com/downloads/visual-studio-add-in anschauen. Neben dem Addin wird dann noch das Frame­work benö­tigt wel­ches unter http://qt.nokia.com/downloads/windows-cpp-vs2008 bezo­gen wer­den kann. Anschlie­ßend fin­det man im Visual Stu­dio einen neuen Menü­punkt Qt. Das Addin ist damit installiert.

Nun sollte noch die Umge­bungs­va­ria­ble Path um das bin Ver­zeich­nis des Qt Fram­works erwei­tert wer­den (z.B. C:\Qt\4.6.3\bin) sowie eine neue Umge­bungs­va­ria­ble namens QTDIR ange­legt wer­den in wel­cher der Pfad des gesam­ten Fram­works steht (z.B. C:\Qt\4.6.3\). Nun kann mit Qt gear­bei­tet werden.

Wei­tere Infor­ma­tio­nen gibt es unter:
http://mm-werkstatt.informatik.uni-augsburg.de/documents/tutorials/qt2005.pdf

SNES Emu­la­to­ren unter Linux sind so eine Sache. Wir haben da ein­mal SNES9x, ZSNES und noch einen Emu­la­tor den ich aber erst spä­ter nen­nen möchte :) Unter Win­dows benutze ich immer SNES9x. Das war dort für mich das Non Plus Ultra. Ein schöne Ober­flä­che und er machte wofür er gemacht ist: Spiele emu­lie­ren. Lei­der sieht es mit der Ober­flä­che für SNES 9x nicht ganz so rosig aus. Und Full­screen wollte er bei mir auch nicht lau­fen. Von der Con­trol­ler­un­ter­stüt­zung unter Linux in Ver­bin­dung mit SNES9x fange ich jetzt gar nicht erst an. Für Win­dows ist SNES9x unter http://www.snes9x.com/ zu finden.

Also musste eine Alter­na­tive her. Diese Alter­na­tive war ZSNES. Beim ers­ten Mal ist die Ober­flä­che gewöh­nungs­be­dürf­tig, aber bes­ser als gar keine Ober­flä­che ;) ZSNES ist dabei zu gro­ßen Tei­len in Assem­bler geschrie­ben, was sich spür­bar auf die Geschwin­dig­keit aus­wirkt. Die Con­trol­ler­un­ter­stü­zung ist auch spitze, es funk­tio­niert ein­fach. Und für Net­books ist es dank der gerin­gen Resour­cen­be­las­tung ideal. ZSNES ist dabei unter http://www.zsnes.com/ zu finden.

So und nun zum drit­ten Emu­la­tor im Bunde den ich per­sön­lich bevor­zuge (wenn ich nicht gerade auf dem Net­book spiele). Die­ser Emu­la­tor emu­liert das SNES dabei so genau wie mög­lich und ver­zich­tet voll­stän­dig auf irgend­wel­che Hacks. Nach­teil an die­ser Phi­lo­so­phie ist, das der Emu­la­tor einen recht leis­tungs­star­ken Rech­ner benö­tigt. Der Vor­teil ist, das bis auf drei Spiele (deren Spe­zi­al­chips noch nicht emu­liert wer­den) alle ande­ren Spiele ohne Pro­bleme lau­fen. Die Rede ist hier­bei von bsnes wel­cher unter http://byuu.org/bsnes/ zu fin­den ist. Es gibt ihn dabei für Win­dows und Linux und er baut auf dem Qt Frame­work auf. Der Code steht dabei unter GPL.

Wei­tere Infor­ma­tio­nen gibt es unter:
http://de.wikipedia.org/wiki/SNES
http://de.wikipedia.org/wiki/SNES-Emulator

Ich spiele seit eini­gen Tagen Net­hack. Eines die­ses Spiele wo man sich sagt: „Warum habe ich nur damit ange­fan­gen?“ ;) Dabei begibt man sich in Dun­geon und sucht nach einem Amu­let. Bei die­sem Spiel merkt man das es schon etli­che Jahre auf dem Buckel hat und das Dev­Team hat an wirk­lich alles gedacht :) Eine kurze Ein­lei­tung gibt es unter http://www.plenz.com/nethack_german. Wer das ganze unter Ubuntu aus­pro­bie­ren möchte kann die Pakete nethack-console bzw. nethack-qt instal­lie­ren. Es gibt auch eine GTK Ver­sion des­sen Paket­name mir gerade ent­fal­len ist. Und nethack-console sieht aus wie ein wich­ti­ges Sys­tem­tool ;)

Wei­tere Infor­ma­tio­nen gibt es unter:
http://de.wikipedia.org/wiki/NetHack