Android und MSVC 2017
« | 17 Apr 2021 | »Schon sein einiger Zeit beinhaltet das GATE Projekt eine separate Visual Studio 2017 Solution mit einem C++ Build für das Android NDK (Native Development Kit).
Man lernt doch so einiges, wenn man Quellcodes durch unterschiedliche Compiler oder Platformen schickt.
Hier mal ein Bericht von der Front:
Vorgeschichte
Mein Kontakt mit dem Android NDK liegt schon über 5 Jahre zurück und war nicht besonders positiv. Da Android auf mich wie eine andere Linux Distribution wirkte, vermutete ich, dass keine sonderlich große Portierung meiner POSIX Sourcen notwendig war.
Leider Falsch! Denn Android unterstützt einige Standard POSIX Features wie
z.B. Shared Memory nicht
und somit laufen solche API-Aufrufe ins Leere.
Auch die C++ STL
und korrektes Exception Handling waren nicht Teil des ursprünglichen Konzeptes
und somit wird die Portierung von nativen Code enorm erschwert.
Anstatt dessen wurden neue Non-Standard C-APIs publiziert, die auf dieser
Plattform zu nutzen sind.
Die Kompatibilität verbesserte sich zwar von NDK Release zu Release und es kamen nach und nach Wrapper-Bibliotheken ins Netz, die APIs wie shmget auf Android Äquivalente hin und her übersetzten … doch ein solches Abhängigkeitschaos wollte ich eigentlich nicht in meiner Code-Base haben.
Installation mit Studio 2017
Mit Microsofts Entscheidung, Android in Visual Studio zu integrieren, stieg
meine Hoffnung, dass es nun einfacher werden könnte, mit dieser Plattform
zu experimentieren.
Denn früher musste man eine Google Installation mit deren eigenen Tools
durchführen und Projekte auf das dort vorherrschende Format konvertieren
bzw. neu anlegen.
Nun übernimmt das alles der Studio Installer und nachdem eine Vorlage und ein Ziel System gewählt wird, richtet die Solution alles bis zum Emulator hin ein.
Kein X86 64 bit
Nun, für Android wird ohnehin meist nur für die ARM Architektur
entwickelt, trotzdem lassen sich X86
32 und 64 bit Ziele anlegen. Leider werden aber für 64-bit keine Header
mitinstalliert.
Im Setup wurde 64-bit aktiviert doch Builds finden dann keine Header, weil
das benötigte Verzeichnis nicht vorhanden ist.
C-locale und math nicht implementiert
Dass System-Funktionen wie shmget()
wie fehlen … naja OK, aber dass
der C-Header <locale.h>
leer implementiert ist, gefällt mir nicht.
Die im GATE Framework integrierte Script-Sprache LUA
macht hier einen Aufruf zu localeconf()
in einem Makro, der nicht aufgelöst
werden kann.
Nun gut, hier geht es um ein alternatives Dezimalkommazeichen.
Das kann man zum Glück per vordefiniertem Maktro in den Projekteinstellungen
überschreiben, z.B. mit: "lua_getlocaledecpoint()='.'"
Und dann fehlt auch noch die C99
Funktion log2
, obwohl der Compiler diesen Standard voll abdecken sollte.
Nun gut, auch hier kann man auf das ältere log
aufweichen und
result = log(value) / log(2.0)
nutzen.
In LUA wird das z.B. durch das Makro LUA_USE_C89
aktiviert.
Emulator mit unterschiedlichen Halbwertszeiten
Das mit Visual Studio mitgelieferte Hyper-V VM Image mit Android in unterschiedlichen API-Levels ist eigentlich genial. Man kompiliert ein X86 Android Paket und das Resultat wird von der IDE in die VM Sitzung geladen um dort live getestet zu werden.
Leider ist dieses Setup aus meiner Sicht instabil, denn mir passiert es stets,
dass nach einiger Zeit (1 - 5 Monte) Android Projekte zwar kompilieren aber
nicht mehr zum Emulator hochgeladen werden können.
Ich vermute, dass Studio-Updates wie auch die halbjährlichen Windows Updates
jedes mal etwas kaputt machen und dann hilft nur noch eine Neuinstallation
oder vollständige Reparaturinstallation von Visual Studio.
Und so etwas nervt über die Jahre hinweg tierisch und wurde bis heute nicht vollständig gefixt.
Fazit
In Summe waren die Probleme gar nicht so groß und im GATE Framework konnte
ich die meisten nicht-existierenden System-APIs einfach per #ifdef
auf den Result-Code NOTIMPLEMENTED
umleiten.
Die Emulatorsache ist lästig, aber wenn er wieder läuft, dann hält es auch für einige Zeit.
In Summe muss ich dem Visual Studio Team ein großes Lob aussprechen. Mit der Möglichkeit Windows und Android Apps in einer Umgebung zu entwickeln, wurde die IDE enorm aufgewertet.
Mein nächstes Ziel wird es sein, ganze Android Apps mit dem GATE Framework zu erstellen. Bin gespannt, was sich da noch alles zeigen wird.