Preparazione del progetto SDL2 per l'esecuzione su Android

Ciao a tutti. Oggi vedremo come preparare un progetto utilizzando la libreria SDL2 per avviare un gioco su Android.

Per prima cosa, è necessario scaricare Android Studio, installarlo e tutto ciò che è richiesto in questo ambiente di sviluppo. Ad esempio, attualmente utilizzo Kde Neon, e in questo sistema esiste un file /etc/environment; un file simile è presente anche in Ubuntu. Qui bisogna definire le seguenti variabili.

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

È anche necessario scaricare l'NDK dal sito ufficiale, decomprimerlo nella cartella home e rinominarlo in NDK. Successivamente, bisogna scaricare la libreria SDL2 dal sito libsdl.org. Per utilizzare SDL2 su Android, è importante non compilarlo per il computer, altrimenti non sarà compilato per Android. Per compilare il progetto, è necessario creare un progetto in Android Studio, qualsiasi progetto, per accettare la licenza; altrimenti, durante la compilazione, SDL2 chiederà la licenza.

Per leggere file in Android dagli assets, bisogna utilizzare le funzioni SDL_RWops. Ecco un esempio di utilizzo nel codice per lavorare con i font. In questo caso, non possiamo usare FT_New_Face, ma utilizzeremo FT_New_Memory_Face per utilizzare i dati già letti.

#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

Ho anche creato un file di intestazione per includere le intestazioni SDL2. NO_SDL_GLEXT è necessario affinché la compilazione vada a buon fine per Android.

#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

Quindi il progetto è pronto, gli shader sono pronti per OpenGL ES 3.0. Ora dobbiamo creare un progetto Android. Per fare ciò, estraiamo l'archivio SDL2. Entro in build-scripts. E eseguo così.

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

Comparirà un messaggio del genere.

Per costruire e installare su un dispositivo per il test, eseguire il seguente comando:
cd /home/cf/programs/SDL2-2.0.10/build/com.xverizex.test
./gradlew installDebug

Ci spostiamo in com.xverizex.test. Entriamo in com.xverizex.test/app/jni/src. Copiamo il nostro progetto di gioco. E modifichiamo il file Android.mk, nel mio caso appare così.

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

# Aggiungi qui i file sorgente della tua applicazione...
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)

Come avrete notato, sto collegando anche la libreria Freetype2. Ne ho trovata già una pronta su GitHub per Android, ma non funzionava, era necessario apportare alcune modifiche. Creiamo anche la cartella app/src/main/assets. Qui posizioniamo le nostre risorse (font, sprite, modelli 3D).

Ora configuriamo Freetype2 per Android. Scarichiamo dal mio GitHub Link, e copiamo la cartella Freetype2 nella cartella app/jni/. È tutto pronto. Ora eseguiamo nel comando com.xverizex.test ./gradlew installDebug. Per poter aggiungere questo gioco su Android, il debug deve essere attivato in Android. Per farlo, dobbiamo andare nelle impostazioni, selezionare "Sistema", poi "Informazioni sul tablet" e premere circa sei volte sull'opzione "Numero di build". Dopo torniamo indietro e appare l'opzione per sviluppatori. Entriamo e attiviamo, attiviamo anche l'opzione "Debug USB". Ora dobbiamo ottenere la chiave per il tablet. A tal fine, installiamo il programma adb. Avviamo adb shell nella console, e sul tablet appare una chiave che deve essere accettata. Bene, ora i giochi possono essere caricati sul tablet.

Fonte: habr.com

Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster