Vorbereitung des SDL2-Projekts für den Start auf Android

Hallo zusammen. Heute schauen wir uns an, wie man ein Projekt mit der sdl2-Bibliothek für die Ausführung eines Spiels auf Android vorbereitet.

Zunächst müssen Sie Android Studio herunterladen, installieren und alles, was für diese Entwicklungsumgebung erforderlich ist, einrichten. Zum Beispiel habe ich gerade Kde Neon, und in diesem System gibt es die Datei /etc/environment, die auch in Ubuntu existiert. Dort müssen Sie solche Variablen eintragen.

ANDROID_HOME=/home/benutzer/Android/Sdk
ANDROID_NDK_HOME=/home/benutzer/ndk

Sie müssen auch das NDK von der offiziellen Website herunterladen, es in Ihr Home-Verzeichnis entpacken und in NDK umbenennen. Danach müssen Sie die SDL2-Bibliothek von der Seite libsdl.orgherunterladen. 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. Damit das Projekt kompiliert wird, müssen Sie ein beliebiges Projekt in Android Studio erstellen, um die Lizenz zu akzeptieren, da SDL2 sonst die Lizenz während des Builds anfordern wird.

Um Dateien in Android aus Assets zu lesen, müssen Sie die Funktionen SDL_RWops verwenden. Hier ist ein Beispiel für die Verwendung im Code für den Umgang mit 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 zum Einbinden der SDL2-Header erstellt. NO_SDL_GLEXT ist erforderlich, damit die Kompilierung für Android erfolgreich verläuft.

#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 also bereit, die Shader sind für OpenGL ES 3.0 bereit. Jetzt müssen wir ein Android-Projekt erstellen. Dazu entpacken wir das SDL2-Archiv. Wir gehen in den build-scripts. Und führen es so aus.

./androidbuild.sh com.xverizex.test main.cpp

Es wird diese Meldung erscheinen.

Um zu bauen und auf ein Gerät zur Testung zu installieren, führen Sie Folgendes aus:
cd /home/cf/programs/SDL2-2.0.10/build/com.xverizex.test
./gradlew installDebug

Gehen Sie zu com.xverizex.test. Navigieren Sie 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 Anwendungsquellfiles 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, füge ich auch die Freetype2-Bibliothek hinzu. Ich habe bereits eine von GitHub für Android gefunden, aber sie funktionierte nicht, ich musste einige Sachen ändern. Erstellen Sie auch das Verzeichnis app/src/main/assets. Dort legen Sie unsere Ressourcen (Schriftarten, Sprites, 3D-Modelle) ab.

Jetzt richten wir Freetype2 für Android ein. Laden Sie es von meinem GitHub herunter. Link, und kopieren Sie das Verzeichnis Freetype2 in das Verzeichnis app/jni/. Alles ist bereit. Jetzt starten wir im com.xverizex.test-Befehlszeile ./gradlew installDebug. Damit das Spiel zu Android hinzugefügt werden kann, muss in Android das Debugging aktiviert sein. Gehen Sie dazu zu den Einstellungen, dann zu "System", dann zu "Über das Tablet" und tippen Sie etwa sechs Mal auf die Option "Build-Nummer". Gehen Sie dann zurück und die Option für Entwickler wird angezeigt. Gehen Sie hinein und aktivieren Sie sie, ebenso die Option "USB-Debugging". Jetzt müssen Sie einen Schlüssel für das Tablet erhalten. Installieren Sie dazu das Programm adb. Starten Sie in der Konsole adb shell, und auf dem Tablet erscheint der Schlüssel, den Sie akzeptieren müssen. Alles, jetzt können Spiele auf das Tablet geladen werden.

Quelle: habr.com

60GB SSD 8Gb DDR4