Android mit Ogre3D
In diesem Tutorial zeige ich euch wie man mit Hilfe der Open Source 3D Engine Ogre3D das erste kleine Programm für Android erstellt. Wir erstellen die Engine für Android und danach bauen wir noch den Ogre3D Sample Browser. Damit kann man zahlreiche Demoprogramme am Smartphone laufen lassen und bekommt einen ersten Eindruck der Engine auf dem Android Gerät.
Android mit Ogre3D
Schon seit einiger Zeit reizt mich das Thema 3D am Android Gerät. Anfängertutorials mit OpenGL sind für jemanden der Spieleprogrammierung studiert hat etwas zu langweilig, deshalb war die Idee gleich eine 3D Engine auf das Android Gerät zu bringen. Ogre 3D ist eine der bekanntesten Open Source 3D Engines die man findet, deshalb war es nahe liegend damit zu experimentieren. Es gibt zwar rudimentäre Dokus dazu, eine funktionierende Lösung findet man selbst nach langer Recherche nicht. Ich hoffe ich habe alle aufgetretenen Fehler bei meiner Recherche und Entwicklung hier aufgezeigt, damit ihr das selber nachstellen könnt.
Abhängigkeiten compilieren
Bevor wir uns überhaupt an die Engine wagen können, müssen wir dessen Abhängigkeiten erstellen. Wie so oft bei C++ Projekten verwenden Entwickler fertige Bibliotheken, die wir ebenfalls builden müssen. Das ist, rückwirkend betrachtet, der schwierigste Teil des Tutorials.
Vorbereitung
Zuerst installiert man Android Studio und CMake. Die beiden Programme werden wir im laufe der Erstellung unserer App benötigen. Unter Android Studio lädt man sich dann die aktuellen Versionen der Android SDK und NDK herunter (NDK benötigen wir, damit C++ Code auf Android laufen kann).
cmake und den dafür benötigten Compiler installiert man mit:
sudo apt-get install cmake gcc g++
Im nächsten Schritt lädt man die OGRE dependencies herunter. Diese findet man unter dem folgenden Link:
https://bitbucket.org/cabalistic/ogredeps
Das Projekt laden wir herunter und entpacken in einer Ordner. Vom root Verzeichnis des entpackten ogredeps Ordners können wir den Code mit cmake compilieren. Das geht mit folgendem Befehl:
cmake -G"Unix Makefiles" -DCMAKE_TOOLCHAIN_FILE="../cmake/android.toolchain.cmake" -DANDROID_ABI=armeabi-v7a -DANDROID_NATIVE_API_LEVEL=19 -DANDROID_TOOLCHAIN_NAME=arm-linux-androideabi-4.9 .
Ich habe 2 Dinge geprüft:
- ANDROID_TOOLCHAIN_NAME
dafür gibt es im NDK Ordner den Unterordner toolchains. In meiner Version war dort arm-linux-androideabi-4.9 vorhanden - ANDROID-NATIVE_API_LEVEL
für mein Testprogramm verwende ich die API 19 (Android 4.4 Kitkat)
Probleme beheben
Beim ersten Versuch habe ich folgende Fehlermeldung bekommen:
CMake Error: CMAKE_C_COMPILER not set, after EnableLanguage
CMake Error: CMAKE_CXX_COMPILER not set, after EnableLanguage
klarerweise ist beim neu installierten cmake noch kein Compiler definiert. das machen wir wie folgt:
cmake -G“Unix Makefiles“ -DCMAKE_C_COMPILER=/usr/bin/gcc -DCMAKE_CXX_COMPILER=/usr/bin/g++ -DCMAKE_TOOLCHAIN_FILE=“/home/werner/android-sdks/cmake/3.6.3155560/android.toolchain.cmake“ -DANDROID_ABI=armeabi-v7a -DANDROID_NATIVE_API_LEVEL=19 -DANDROID_TOOLCHAIN_NAME=arm-linux-androideabi-4.9 .
der nächste Fehler sagt mir, dass die verwendete cmake Version von Ubuntu zu alt ist:
CMake Error at /home/werner/android-sdks/cmake/3.6.3155560/android.toolchain.cmake:41 (cmake_minimum_required):
CMake 3.6.0 or higher is required. You are running version 3.5.1
von der offiziellen Homepage lade ich mir deshlab die Version 3.8.1 von CMake herunter und entpacke dieses Programm im /usr/local Ordner. Das Kommando sieht nun wie folgt aus:
/usr/local/cmake-3.8.1-Linux-x86_64/bin/cmake -G“Unix Makefiles“ -DCMAKE_C_COMPILER=/usr/bin/gcc -DCMAKE_CXX_COMPILER=/usr/bin/g++ -DCMAKE_TOOLCHAIN_FILE=“/home/werner/android-sdks/cmake/3.6.3155560/android.toolchain.cmake“ -DANDROID_ABI=armeabi-v7a -DANDROID_NATIVE_API_LEVEL=19 -DANDROID_TOOLCHAIN_NAME=arm-linux-androideabi-4.9 .
Damit bin ich aber leider immer noch nicht am Ziel. Der neue Fehler lautet:
Android NDK unspecified.
Also füge ich noch den Pfad zum NDK hinzu:
/usr/local/cmake-3.8.1-Linux-x86_64/bin/cmake -G“Unix Makefiles“ -DCMAKE_C_COMPILER=/usr/bin/gcc -DCMAKE_CXX_COMPILER=/usr/bin/g++ -DANDROID_NDK=“/home/werner/android-sdks/ndk-bundle“ -DCMAKE_TOOLCHAIN_FILE=“/home/werner/android-sdks/cmake/3.6.3155560/android.toolchain.cmake“ -DANDROID_ABI=armeabi-v7a -DANDROID_NATIVE_API_LEVEL=19 -DANDROID_TOOLCHAIN_NAME=arm-linux-androideabi-4.9 .
Tja, leider passt es noch immer nicht. Nun meckert cmake, dass die NDK Version nicht passt:
Invalid Android NDK revision (should be 12): 14.1.3816874.
Die Lösung des Problems war relativ einfach. Ich habe die android.toolchain.cmake vom SDK verwendet. Beim NDK ist auch eine dabei. Ich habe den Pfad geändert, danach ist der cmake Befehl problemlos durchgelaufen.
/usr/local/cmake-3.8.1-Linux-x86_64/bin/cmake -G“Unix Makefiles“ -DCMAKE_C_COMPILER=/usr/bin/gcc -DCMAKE_CXX_COMPILER=/usr/bin/g++ -DANDROID_NDK=“/home/werner/android-sdks/ndk-bundle“ -DCMAKE_TOOLCHAIN_FILE=“/home/werner/android-sdks/ndk-bundle/build/cmake/android.toolchain.cmake“ -DANDROID_ABI=armeabi-v7a -DANDROID_NATIVE_API_LEVEL=19 -DANDROID_TOOLCHAIN_NAME=arm-linux-androideabi-4.9 .
Juhu, damit sind die makefiles erstellt. Jetzt muss man nur noch den Compiler drüber laufen lassen und die Abhängigkeiten für Ogre 3D sind erstellt.
Make
Compiliert wird der Source Code mit dem am System installierten build system. Dieses wird auf der Konsole durch folgenden Befehl gestartet:
make
Jetzt kann man sich erst mal einen Kaffee holen. Der Source Code wird nun vom Compiler bearbeitet. Neben den Pfaden zu den erstellten Dateien werden auch ein paar Warnings und Info Meldungen ausgegeben. Nachdem die *.o Dateien erstellt wurden kann man das Projekt nun installieren:
make install
Es wird im Hauptverzeichnis ein neuer Ordner ogredeps erstellt mit den erforderlichen libs und in include Dateien. Die für Ogre notwendigen Abhängigkeiten wurden erfolgreich erstellt!
Ogre Source Code compilieren
Nachdem wir nun die Abhängigkeiten erstellt haben bleibt nun noch der eigentliches Source Code von Ogre 3D. Dafür müssen wir uns zuerst den Code aus dem aktuellen Repo laden. Ich setze in diesem Artikel auf die aktuelle stable Version 1.10. Vom Hauptverzeichnis aus erstellen wir wieder unser make file:
—/usr/local/cmake-3.8.1-Linux-x86_64/bin/cmake -G“Unix Makefiles“ -DOGRE_DEPENDENCIES_DIR=“../ogredeps/ogredeps“ -DCMAKE_C_COMPILER=/usr/bin/gcc —-DCMAKE_TOOLCHAIN_FILE=“/home/werner/android-sdks/ndk-bundle/build/cmake/android.toolchain.cmake“ -DANDROID_ABI=armeabi-v7a -DANDROID_NATIVE_API_LEVEL=19 -DANDROID_TOOLCHAIN_NAME=arm-linux-androideabi-4.9 .
/usr/local/cmake-3.8.1-Linux-x86_64/bin/cmake -DOGRE_DEPENDENCIES_DIR=“../ogredeps/ogredeps“ -DCMAKE_TOOLCHAIN_FILE=“/home/werner/android-sdks/ndk-bundle/build/cmake/android.toolchain.cmake“ -DANDROID_ABI=armeabi-v7a -DANDROID_NATIVE_API_LEVEL=19 -DANDROID_TOOLCHAIN_NAME=arm-linux-androideabi-4.9 .
Zu beachten ist, dass wir nun den Pfad zu den zuvor erstellten Abhängigkeiten einbinden müssen. Die Fehler von zuvor machen wir diesmal nicht mehr. Mit den erstellten make files compilieren wir Ogre und erstellen die nötigen libs und includes:
make
Beim make hatte ich ein Problem, weil 3 nötige Libs fehlten:
— Could NOT find SDL2 (missing: SDL2_LIBRARY SDL2_INCLUDE_DIR)
— Could NOT find Doxygen (missing: DOXYGEN_EXECUTABLE)
— Could not locate Softimage
SDL2 installiert man recht einfach mit:
sudo apt-get install libsdl2-dev
Doxygen mit:
sudo apt-get install doxygen doxygen-doc doxygen-gui graphviz
für den Softimage Fehler soll man laut Info freetype6-dev installieren. Das war bereits installiert. Bei mir hat die Installation folgender Libs den Fehler behoben.
sudo apt-get install libfreetype6-dev libfreeimage-dev libzzip-dev libxrandr-dev libxaw7-dev freeglut3-dev libgl1-mesa-dev libglu1-mesa-dev
make ist bei mir dann Fehlerfrei durchgelaufen. Im nachhinein bin ich dann drauf gekommen, dass das Projekt ja als ndk gebaut werden muss weshalb der korrekte make Befehl vom Android ndk zu nehmen ist. Also zuerst
make clean
falls ihr das auch falsch gebaut habt und dann:
android-sdks/ndk-bundle/prebuilt/linux-x86_64/bin/make
linux-x86_64 müsst ihr mit eurem Host Build System ersetzen. Einfach in den Ordner schauen was da ist und das passende nehmen. Gratulation. Nun wurde Ogre 3D erfolgreich für NDK compiliert.
OGRE Sample Browser
Ich schließe dieses „kurze“ Tutorial damit ab, dass wir den OGRE Sample Browser auf dem Android Gerät zum Laufen bringen. Dafür brauchen wir Ant, ein Build Tool für die Android auf der Kommandozeile. Früher wurde das auch von der Eclipse IDE eingesetzt. Android Entwickler haben das Tool vermutlich bereits installiert, unter Linux installiert sich das direkt aus dem Paket Manager:
sudo apt-get install ant
Wir wechseln nun zum Sampl Browser Projekt. Bei mir liegt das unter dem Ogre Hauptordner unter: Samples/Browser. In dem Verzeichnis erstellen wir nun das Projekt mit:
android-sdks/ndk-bundle/build/ndk-build all
Der ndk-build Befehl befindet sich genau so wie das zuletzt verwendete make im Android NDK. Eventuell hat das bei euch eine andere Ordnerstruktur.
Fazit
Damit endet eines der längsten Tutorials meines Blogs. 3D Programmierung beziehungsweise Spieleprogrammierung gehört zu den Paradedisziplinen der Kunst der Programmentwicklung. Mit Ogre 3D haben wir eine effiziente Open Source 3D Engine die bereits seit vielen Jahren weiterentwickelt wird. Die Engine kann man recht problemlos auch unter Android nutzen. Die nötigen Steps dazu habe ich gezeigt und auch mögliche Fehlerquellen und deren Behebung berichtet. Ich hoffe der eine oder andere hat zumindest den Sample Browser auf seinem Android Gerät testen können.