Vorbereiten eines SDL2-Projekts für die Ausführung auf Android

Hallo zusammen. Heute schauen wir uns an, wie man mit der SDL2-Bibliothek ein Projekt vorbereitet, um ein Spiel auf Android auszuführen.

Zuerst müssen Sie Android Studio herunterladen, installieren und alles, was in dieser Entwicklungsumgebung erforderlich ist. Ich habe zum Beispiel jetzt Kde Neon und auf diesem System gibt es eine Datei /etc/environment, die gleiche Datei existiert in Ubuntu. Dort müssen folgende Variablen eingetragen werden.

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

Sie müssen NDK außerdem von der offiziellen Website herunterladen, es in Ihr Home-Verzeichnis entpacken und in NDK umbenennen. Als nächstes müssen Sie die SDL2-Bibliothek von der Website herunterladen libsdl.org. 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 werden kann, müssen Sie in Android Studio ein beliebiges Projekt erstellen und die Lizenz akzeptieren. Andernfalls fragt SDL2 beim Erstellen nach einer Lizenz.

Um Dateien in Android aus Assets zu lesen, müssen Sie die SDL_RWops-Funktionen verwenden. Hier ist ein Beispiel für die Verwendung im Code zum Arbeiten mit einer Schriftart. In diesem Fall können wir FT_New_Face nicht verwenden, sondern verwenden stattdessen FT_New_Memory_Face, um die bereits gelesenen Daten zu verwenden.

#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 erstellt, um SDL2-Header zu verbinden. NO_SDL_GLEXT ist für eine erfolgreiche Kompilierung auf Android erforderlich.

#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 fertig, die Shader sind bereit für Opengl Es 3.0. Jetzt müssen wir ein Android-Projekt erstellen. Entpacken Sie dazu das SDL2-Archiv. Gehen Sie zu Build-Skripte. Und wir machen es so.

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

Die folgende Meldung wird angezeigt.

To build and install to a device for testing, run the following:
cd /home/cf/programs/SDL2-2.0.10/build/com.xverizex.test
./gradlew installDebug

Gehen Sie zu com.xverizex.test. Gehen Sie zu com.xverizex.test/app/jni/src. Wir kopieren unser Spielprojekt. Und wir ändern die Android.mk-Datei, in meinem Fall sieht sie 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

# Add your application source files here...
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, binde ich auch die Freetype2-Bibliothek ein. Ich habe auf Github ein fertiges für Android gefunden, aber es hat nicht funktioniert, ich musste etwas ändern. Wir erstellen auch ein Verzeichnis app/src/main/assets. Darin platzieren wir unsere Ressourcen (Schriftarten, Sprites, 3D-Modelle).

Jetzt konfigurieren wir Freetype2 für Android. Von meinem Github herunterladen Link, und kopieren Sie das Freetype2-Verzeichnis in das Verzeichnis app/jni/. Alles ist fertig. Führen Sie nun den Befehl ./gradlew installDebug in com.xverizex.test aus. Um dieses Spiel zu Android hinzufügen zu können, muss das Debuggen in Android aktiviert sein. Dazu müssen Sie zu den Einstellungen gehen, zu „System“ gehen, zu „Über das Tablet“ gehen und etwa sechs Mal auf die Option „Build-Nummer“ klicken. Gehen Sie dann zurück und die Option für Entwickler wird angezeigt. Gehen Sie hinein und schalten Sie es ein. Aktivieren Sie auch die Option „USB-Debugging“. Jetzt müssen Sie einen Schlüssel für das Tablet besorgen. Installieren Sie dazu das ADB-Programm. Wir starten die ADB-Shell in der Konsole und im Tablet erscheint ein Schlüssel, der akzeptiert werden muss. Jetzt können Spiele auf Ihr Tablet heruntergeladen werden.

Source: habr.com

Kommentar hinzufügen