Voorbereiding van het SDL2-project voor uitvoering op Android

Hallo allemaal. Vandaag gaan we kijken hoe we een project kunnen voorbereiden met de sdl2-bibliotheek om een game op Android te draaien.

Als eerste moet je Android Studio downloaden, installeren en alles wat nodig is voor deze ontwikkelomgeving. Bijvoorbeeld, ik heb momenteel Kde Neon, en in dit systeem is er een bestand /etc/environment, datzelfde bestand is er ook in Ubuntu. Daar moeten we enkele variabelen instellen.

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

Daarnaast moet je de NDK van de officiƫle website downloaden, deze uitpakken in je home-directory en deze hernoemen naar NDK. Vervolgens moet je de SDL2-bibliotheek van de site downloaden libsdl.org. Om sdl2 voor Android te gebruiken, is het belangrijk om het niet voor de computer te compileren, omdat het dan niet voor Android kan worden gecompileerd. Om een project te compileren, moet je een project in Android Studio aanmaken, wat dan ook, om de licentie te accepteren, anders zal SDL2 om een licentie vragen bij het bouwen.

Om bestanden in Android uit assets te lezen, moet je de SDL_RWops-functies gebruiken. Hier is een voorbeeld van gebruik in de code voor het werken met lettertypen. In dit geval kunnen we FT_New_Face niet gebruiken, en in plaats daarvan zullen we FT_New_Memory_Face gebruiken om de al gelezen gegevens te gebruiken.

#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

Ik heb ook een header-bestand gemaakt voor het opnemen van de SDL2-headerbestanden. NO_SDL_GLEXT is nodig zodat de compilatie succesvol verloopt voor 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

Dus het project is gereed, de shaders zijn gereed voor Opengl Es 3.0. Nu moeten we een android-project aanmaken. Hiervoor pakken we het SDL2-archief uit. We gaan naar build-scripts. En voeren het als volgt uit.

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

Er verschijnt een dergelijke melding.

Om te bouwen en te installeren op een apparaat voor tests, voer je het volgende uit:
cd /home/cf/programs/SDL2-2.0.10/build/com.xverizex.test
./gradlew installDebug

We gaan naar com.xverizex.test. Ga naar com.xverizex.test/app/jni/src. Kopieer je gameproject. En wijzig het bestand Android.mk, in mijn geval ziet het er als volgt uit.

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

# Voeg hier je applicatiebronnen toe...
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)

Zoals je misschien al hebt opgemerkt, koppel ik ook de Freetype2-bibliotheek. Ik vond al een werkende versie op github voor Android, maar deze werkte niet, er moest iets worden gewijzigd. Maak ook de map app/src/main/assets aan. Daarin plaatsen we onze bronnen (lettertypen, sprites, 3D-modellen).

Laten we Freetype2 voor Android instellen. Download van mijn GitHub. Link, en kopieer de Freetype2-map naar de map app/jni/. Alles is klaar. Voer nu het commando .\/gradlew installDebug uit in com.xverizex.test. Om deze game aan Android toe te voegen, moet de foutopsporing in Android zijn ingeschakeld. Ga hiervoor naar Instellingen, ga naar 'Systeem', ga naar 'Over tablet' en tik ongeveer zes keer op de optie 'Buildnummer'. Ga daarna terug en verschijnt de optie voor ontwikkelaars. Ga erin en schakel deze in, schakel ook de optie 'USB-foutopsporing' in. Nu moet je een sleutel voor de tablet verkrijgen. Installeer hiervoor het programma adb. Voer adb shell uit in de console, en op de tablet verschijnt een sleutel die je moet accepteren. Dat is het, nu kunnen games op de tablet worden geladen.

Bron: habr.com

Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers šŸ”„ Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers | ProHoster