Hallo zusammen. Heute schauen wir uns an, wie man ein Projekt mit der SDL2-Bibliothek vorbereitet, um ein Spiel auf Android zu starten.
Zuerst müssen Sie Android Studio herunterladen, es installieren und alles, was für die Entwicklung in dieser Umgebung erforderlich ist. Zum Beispiel habe ich gerade Kde Neon, und in diesem System gibt es die Datei /etc/environment, die auch in Ubuntu vorhanden ist. Dort müssen solche Variablen festgelegt werden.
ANDROID_HOME=/home/username/Android/Sdk
ANDROID_NDK_HOME=/home/username/ndk
Sie müssen auch das NDK von der offiziellen Website herunterladen, es in Ihr Home-Verzeichnis entpacken und in NDK umbenennen. Danach sollten Sie die SDL2-Bibliothek von der Website herunterladen. Um SDL2 für Android zu verwenden, ist es wichtig, es nicht für den Computer zu kompilieren, da es dann nicht für Android kompiliert werden kann. Um das Projekt zu kompilieren, müssen Sie ein beliebiges Projekt in Android Studio erstellen, um die Lizenz zu akzeptieren, da SDL2 sonst bei der Erstellung nach einer Lizenz fragen wird.
Um Dateien auf Android aus den Assets zu lesen, müssen Sie die Funktionen SDL_RWops verwenden. Hier ist ein Beispiel für die Verwendung im Code zur Verarbeitung von Schriftarten. In diesem Fall können wir FT_New_Face nicht verwenden, sondern müssen FT_New_Memory_Face verwenden, um bereits gelesene Daten zu nutzen.
#ifdef __ANDROID__
snprintf ( path, 254, "fonts/%s", file );
SDL_RWops *rw = SDL_RWFromFile(path, "r" );
char *memory = ( char * ) calloc ( rw->hidden.androidio.size, 1 );
SDL_RWread(rw, memory, 1, rw->hidden.androidio.size );
FT_New_Memory_Face(*this->ft_library, ( const FT_Byte * )memory, rw->hidden.androidio.size, 0, &this;->face );
SDL_RWclose(rw);
free ( memory );
#else
snprintf ( path, 254, "%s/fonts/%s", DEFAULT_ASSETS, file );
if ( access ( path, F_OK ) ) {
fprintf ( stderr, "not found font: %sn", path );
exit ( EXIT_FAILURE );
}
struct stat st;
stat ( path, &st; );
FILE *rw = fopen ( path, "r" );
char *memory = ( char * ) calloc ( st.st_size, 1 );
fread ( memory, 1, st.st_size, rw );
FT_New_Memory_Face ( *this->ft_library, ( const FT_Byte * ) memory, st.st_size, 0, &this;->face );
fclose ( rw );
free ( memory );
#endif
Ich habe auch eine Header-Datei für die Einbindung der SDL2-Header erstellt. NO_SDL_GLEXT ist erforderlich, damit die Kompilierung für Android erfolgreich ist.
#ifdef __ANDROID__
#include "SDL.h"
#include "SDL_video.h"
#include "SDL_events.h"
#define NO_SDL_GLEXT
#include "SDL_opengl.h"
#include "SDL_opengles2.h"
#else
#include <SDL2/SDL.h>
#include <SDL2/SDL_video.h>
#include <SDL2/SDL_opengl.h>
#include <SDL2/SDL_opengles2.h>
#endif
Das Projekt ist bereit, die Shader sind für OpenGL ES 3.0 vorbereitet. Jetzt müssen wir ein Android-Projekt erstellen. Entpacken Sie dazu das SDL2-Archiv. Gehen Sie in die Build-Skripte und führen Sie Folgendes aus.
./androidbuild.sh com.xverizex.test main.cpp
Eine solche Nachricht wird angezeigt.
Um das Projekt zu erstellen und auf ein Gerät zum Testen zu installieren, führen Sie Folgendes aus:
cd /home/cf/programs/SDL2-2.0.10/build/com.xverizex.test
./gradlew installDebug
Navigieren Sie zu com.xverizex.test. Gehe zu com.xverizex.test/app/jni/src. Kopieren Sie Ihr Spielprojekt und ändern Sie die Datei Android.mk. In meinem Fall sieht das so aus.
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := main
SDL_PATH := ../SDL
FREETYPE_PATH := ../Freetype2
LOCAL_C_INCLUDES := $(LOCAL_PATH)/$(SDL_PATH)/include $(LOCAL_PATH)/$(FREETYPE_PATH)/include
# Fügen Sie hier Ihre Anwendungsquellcodes hinzu...
LOCAL_SRC_FILES := ./engine/lang.cpp ./engine/actor.cpp ./engine/sprite.cpp ./engine/shaders.cpp ./engine/box.cpp ./engine/menubox.cpp ./engine/load_manager.cpp ./engine/main.cpp ./engine/font.cpp ./engine/model.cpp ./engine/button.cpp ./theme.cpp ./level_manager.cpp ./menu/menu.cpp
LOCAL_SHARED_LIBRARIES := SDL2 Freetype2
LOCAL_LDLIBS := -lGLESv1_CM -lGLESv2 -llog
include $(BUILD_SHARED_LIBRARY)
Wie Sie vielleicht schon bemerkt haben, integriere ich auch die Freetype2-Bibliothek. Ich habe eine fertige Version auf GitHub für Android gefunden, aber sie funktionierte nicht, ich musste einige Anpassungen vornehmen. Außerdem erstellen wir das Verzeichnis app/src/main/assets. Darin legen wir unsere Ressourcen (Schriftarten, Sprites, 3D-Modelle) ab.
Jetzt richten wir Freetype2 für Android ein. Laden Sie es von meinem GitHub herunter, , und kopieren Sie das Freetype2-Verzeichnis in das app/jni/-Verzeichnis. Alles ist bereit. Jetzt führen wir im Verzeichnis com.xverizex.test den Befehl ./gradlew installDebug aus. Um dieses Spiel auf Android hinzuzufügen, muss auf Android die Entwickleroption aktiviert sein. Gehen Sie dazu in die Einstellungen, klicken Sie auf 'System', dann auf 'Über das Tablet' und tapen Sie ungefähr sechs Mal auf die Option 'Build-Nummer'. Gehen Sie dann zurück, und eine Option für die Entwickler erscheint. Dort aktivieren wir sie und aktivieren auch die Option 'USB-Debugging'. Jetzt müssen wir den Schlüssel für das Tablet erhalten. Dazu installieren wir das Programm adb. Wir starten in der Konsole adb shell, und auf dem Tablet erscheint ein Schlüssel, den wir annehmen müssen. Fertig, jetzt können Spiele auf das Tablet heruntergeladen werden.
Quelle: habr.com
