Προετοιμασία ενός έργου SDL2 για εκτέλεση σε android

Γεια σε όλους. Σήμερα θα δούμε πώς να προετοιμάσετε ένα έργο χρησιμοποιώντας τη βιβλιοθήκη sdl2 για να τρέξετε το παιχνίδι στο android.

Πρώτα πρέπει να κατεβάσετε το Android Studio, να το εγκαταστήσετε και όλα όσα απαιτούνται σε αυτό το περιβάλλον ανάπτυξης. Για παράδειγμα, αυτή τη στιγμή έχω το Kde Neon και υπάρχει ένα αρχείο /etc/environment σε αυτό το σύστημα, το ίδιο αρχείο υπάρχει και στο ubuntu. Εκεί είναι απαραίτητο να καταχωρηθούν τέτοιες μεταβλητές.

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

Πρέπει επίσης να κατεβάσετε το NDK από τον επίσημο ιστότοπο, να το αποσυμπιέσετε στον αρχικό σας κατάλογο και να το μετονομάσετε σε NDK. Στη συνέχεια, πρέπει να κάνετε λήψη της βιβλιοθήκης SDL2 από τον ιστότοπο libsdl.org. Για να χρησιμοποιήσετε το sdl2 για android είναι σημαντικό να μην το μεταγλωττίσετε για υπολογιστή γιατί τότε δεν θα μεταγλωττιστεί για android. Για να γίνει η μεταγλώττιση του έργου, πρέπει να δημιουργήσετε ένα έργο στο android studio, οποιοδήποτε, για να αποδεχτείτε την άδεια, διαφορετικά κατά την κατασκευή του SDL2 θα ζητήσει άδεια.

Για να διαβάσετε αρχεία στο android από στοιχεία, πρέπει να χρησιμοποιήσετε τις λειτουργίες SDL_RWops. Ακολουθεί ένα παράδειγμα χρήσης του σε κώδικα για εργασία με γραμματοσειρά. Σε αυτήν την περίπτωση, δεν μπορούμε να χρησιμοποιήσουμε το FT_New_Face, αλλά θα χρησιμοποιήσουμε το FT_New_Memory_Face για να χρησιμοποιήσουμε τα δεδομένα που έχουν ήδη αναγνωσθεί.

#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

Επίσης δημιούργησα ένα αρχείο κεφαλίδας για να συνδέσω κεφαλίδες SDL2. Απαιτείται NO_SDL_GLEXT για την επιτυχία της μεταγλώττισης για 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

Έτσι το έργο είναι έτοιμο, οι shaders είναι έτοιμοι για το Opengl Es 3.0. Τώρα πρέπει να δημιουργήσουμε ένα android-project. Για να το κάνετε αυτό, αποσυσκευάστε το αρχείο SDL2. Μεταβείτε στο build-scripts. Και το κάνουμε.

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

Αυτό το μήνυμα θα εμφανιστεί.

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

Μεταβείτε στο com.xverizex.test. Μεταβείτε στη διεύθυνση com.xverizex.test/app/jni/src. Αντιγράψτε το έργο του παιχνιδιού σας. Και αλλάζουμε το αρχείο Android.mk, στην περίπτωσή μου μοιάζει με αυτό.

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)

Όπως ίσως έχετε παρατηρήσει, συμπεριλαμβάνω και τη βιβλιοθήκη Freetype2. Βρήκα ένα έτοιμο στο github για android, αλλά δεν δούλεψε, έπρεπε να αλλάξω κάτι. Δημιουργούμε επίσης τον κατάλογο app/src/main/assets. Βάζουμε τους πόρους μας σε αυτό (γραμματοσειρές, sprites, τρισδιάστατα μοντέλα).

Τώρα ας ρυθμίσουμε το Freetype2 για Android. Λήψη από το github μου Σύνδεσμοςκαι αντιγράψτε τον κατάλογο Freetype2 στον κατάλογο app/jni/. Όλα είναι έτοιμα. Τώρα εκτελούμε την εντολή ./gradlew installDebug στο com.xverizex.test. Για να μπορέσετε να προσθέσετε αυτό το παιχνίδι στο android, θα πρέπει να είναι ενεργοποιημένος ο εντοπισμός σφαλμάτων στο android. Για να το κάνετε αυτό, πρέπει να μεταβείτε στις ρυθμίσεις, να μεταβείτε στο "Σύστημα", να μεταβείτε στο "Σχετικά με το tablet" και να κάνετε κλικ στην επιλογή "Αριθμός κατασκευής" περίπου έξι φορές. Στη συνέχεια, επιστρέψτε και θα εμφανιστεί η επιλογή για προγραμματιστές. Μπαίνουμε και το ενεργοποιούμε, ενεργοποιούμε επίσης την επιλογή "Εντοπισμός σφαλμάτων μέσω USB". Τώρα πρέπει να πάρουμε το κλειδί για το tablet. Για να το κάνετε αυτό, εγκαταστήστε το πρόγραμμα adb. Εκκινούμε το κέλυφος adb στην κονσόλα και εμφανίζεται ένα κλειδί στο tablet που πρέπει να γίνει αποδεκτό. Τα πάντα, τώρα τα παιχνίδια μπορούν να ληφθούν στο tablet.

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο