Preparación del proyecto SDL2 para ejecutarse en Android

Hola a todos. Hoy veremos cómo preparar un proyecto utilizando la biblioteca sdl2 para ejecutar un juego en Android.

Para empezar, hay que descargar Android Studio, instalarlo y todo lo que se necesita en este entorno de desarrollo. Por ejemplo, ahora tengo Kde Neon, y en este sistema existe un archivo /etc/environment, el mismo archivo está en ubuntu. Ahí hay que definir las siguientes variables.

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

También se debe descargar NDK desde el sitio oficial, descomprimirlo en el directorio personal y renombrarlo a NDK. A continuación, hay que descargar la biblioteca SDL2 del sitio libsdl.org. Para utilizar sdl2 en Android, es importante no compilarlo para computadora, ya que no se compilará para Android. Para que el proyecto se compile, hay que crear un proyecto en Android Studio, cualquiera, para aceptar la licencia, de lo contrario, al compilar SDL2 pedirá una licencia.

Para leer archivos en Android desde assets, se deben usar las funciones SDL_RWops. Aquí hay un ejemplo de uso en el código relacionado con la fuente. En este caso, no podemos usar FT_New_Face, y en su lugar utilizaremos FT_New_Memory_Face para usar los datos ya leídos.

#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

También creé un archivo de encabezado para incluir los encabezados de SDL2. NO_SDL_GLEXT es necesario para que la compilación se realice correctamente en 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

Así que el proyecto está listo, los shaders están listos para OpenGL ES 3.0. Ahora hay que crear un android-project. Para ello, descomprimimos el archivo SDL2. Vamos a build-scripts. Y ejecutamos así.

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

Aparecerá un mensaje como este.

Para construir e instalar en un dispositivo para pruebas, ejecuta lo siguiente:
cd /home/cf/programs/SDL2-2.0.10/build/com.xverizex.test
./gradlew installDebug

Pasamos a com.xverizex.test. Vamos a com.xverizex.test/app/jni/src. Copiamos nuestro proyecto de juego. Y cambiamos el archivo Android.mk, en mi caso se verá así.

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

# Añade aquí los archivos fuente de tu aplicación...
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)

Como ya habrás notado, también estoy incluyendo la biblioteca Freetype2. Encontré una lista lista en github para Android, pero no funcionaba, había que cambiar algunas cosas. También creamos el directorio app/src/main/assets. En él colocamos nuestros recursos (fuentes, sprites, modelos 3D).

Ahora configuraremos Freetype2 para Android. Descargamos desde mi github Link, y copiamos el directorio Freetype2 en el directorio app/jni/. Todo está listo. Ahora ejecutamos el comando ./gradlew installDebug en com.xverizex.test. Para poder añadir este juego en Android, debe estar habilitada la depuración en Android. Para ello, tenemos que ir a configuraciones, luego a "Sistema", después a "Acerca del tablet" y pulsar aproximadamente seis veces la opción "Número de compilación". Después regresamos atrás y aparecerá la opción para desarrolladores. Entramos y habilitamos, además activamos la opción "Depuración por USB". Ahora debemos obtener la clave para el tablet. Para esto instalamos el programa adb. Ejecutamos en la consola adb shell, y en el tablet aparece una clave que hay que aceptar. Listo, ahora se pueden cargar juegos en el tablet.

Fuente: habr.com

Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS 🔥 Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS | ProHoster