Ciao a tutti. Oggi vedremo come preparare un progetto utilizzando la libreria sdl2 per eseguire un gioco su Android.
Per prima cosa devi scaricare Android Studio, installarlo e tutto ciò che è richiesto in questo ambiente di sviluppo. Ad esempio, ora ho Kde Neon e su questo sistema c'è un file /etc/environment, lo stesso file esiste in Ubuntu. Qui è necessario inserire le seguenti variabili.
ANDROID_HOME=/home/username/Android/Sdk
ANDROID_NDK_HOME=/home/username/ndk
Devi anche scaricare NDK dal sito ufficiale, decomprimerlo nella tua directory home e rinominarlo in NDK. Successivamente è necessario scaricare la libreria SDL2 dal sito web
Per leggere file in Android dalle risorse, è necessario utilizzare le funzioni SDL_RWops. Ecco un esempio di utilizzo nel codice per lavorare con un carattere. In questo caso, non possiamo utilizzare FT_New_Face, ma utilizzeremo invece FT_New_Memory_Face per utilizzare i dati che sono già stati 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 connettere le intestazioni SDL2. NO_SDL_GLEXT è necessario affinché la compilazione abbia esito positivo su 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ò, decomprimere l'archivio SDL2. Vai a build-script. E lo facciamo così.
./androidbuild.sh com.xverizex.test main.cpp
Verrà visualizzato il seguente messaggio.
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
Vai su com.xverizex.test. Vai a com.xverizex.test/app/jni/src. Copiamo il nostro progetto di gioco. E cambiamo 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
# 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)
Come avrai già notato, includo anche la libreria Freetype2. Ne ho trovato uno già pronto su github per Android, ma non ha funzionato, avevo bisogno di cambiare qualcosa. Creiamo anche una directory app/src/main/assets. In esso inseriamo le nostre risorse (font, sprite, modelli 3D).
Ora configuriamo Freetype2 per Android. Scarica dal mio github
Fonte: habr.com