Ciao a tutti. Oggi vedremo come preparare un progetto utilizzando la libreria sdl2 per avviare un gioco su Android.
Per prima cosa, bisogna scaricare Android Studio, installarlo e tutto ciò che è necessario in questo ambiente di sviluppo. Ad esempio, io attualmente ho Kde Neon, e in questo sistema esiste un file /etc/environment, lo stesso file è presente anche in ubuntu. Qui bisogna definire alcune variabili.
ANDROID_HOME=/home/username/Android/Sdk
ANDROID_NDK_HOME=/home/username/ndk
Bisogna anche scaricare l'NDK dal sito ufficiale, decomprimerlo nella directory home e rinominarlo in NDK. Poi occorre scaricare la libreria SDL2 dal sito . Per utilizzare sdl2 su Android, è importante non compilarlo per computer, perché in quel caso non funzionerebbe su Android. Per compilare il progetto, bisogna creare un progetto in Android Studio, qualsiasi esso sia, per accettare la licenza, altrimenti durante la compilazione SDL2 richiederà la licenza.
Per leggere i file in Android da assets, è necessario utilizzare le funzioni SDL_RWops. Ecco un esempio di utilizzo nel codice per gestire i caratteri. In questo caso non possiamo utilizzare FT_New_Face, ma al suo posto 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 bisogna creare un android-project. Per fare ciò, estraiamo l'archivio SDL2. Accediamo a build-scripts. Ed eseguiamo quanto segue.
./androidbuild.sh com.xverizex.test main.cpp
Comparirà un messaggio simile.
Per compilare e installare su un dispositivo per test, esegui il seguente comando:
cd /home/cf/programs/SDL2-2.0.10/build/com.xverizex.test
./gradlew installDebug
Andiamo in com.xverizex.test. Accediamo a 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 tuoi file sorgente dell'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 già notato, sto includendo anche la libreria Freetype2. Ho trovato una versione pronta su github per Android, ma non funzionava, è stato necessario apportare alcune modifiche. Creiamo anche la cartella app/src/main/assets. In essa inseriamo le nostre risorse (font, sprite, modelli 3D).
Configuriamo Freetype2 per Android. Scarichiamo dal mio github , e copiamo la cartella Freetype2 nella cartella app/jni/. È tutto pronto. Ora lanciamo il comando ./gradlew installDebug in com.xverizex.test. Per poter aggiungere questo gioco ad Android, è necessario abilitare il debug su Android. Per fare ciò, bisogna andare nelle impostazioni, accedere a "Sistema", poi in "Informazioni sul tablet" e toccare circa sei volte l'opzione "Numero di build". Poi tornate indietro e apparirà l'opzione per gli sviluppatori. Entrate e attivatela, attivate anche l'opzione "Debug USB". Ora è necessario ottenere una chiave per il tablet. A questo scopo, installiamo il programma adb. Avviamo adb shell nella console, e sul tablet si presenta una chiave che deve essere accettata. Ecco, ora i giochi possono essere caricati sul tablet.
Fonte: habr.com
