Γεια σε όλους. Σήμερα θα δούμε πώς να προετοιμάσετε ένα έργο χρησιμοποιώντας τη βιβλιοθήκη sdl2 για να τρέξετε το παιχνίδι στο android.
Πρώτα πρέπει να κατεβάσετε το Android Studio, να το εγκαταστήσετε και όλα όσα απαιτούνται σε αυτό το περιβάλλον ανάπτυξης. Για παράδειγμα, αυτή τη στιγμή έχω το Kde Neon και υπάρχει ένα αρχείο /etc/environment σε αυτό το σύστημα, το ίδιο αρχείο υπάρχει και στο ubuntu. Εκεί είναι απαραίτητο να καταχωρηθούν τέτοιες μεταβλητές.
ANDROID_HOME=/home/username/Android/Sdk
ANDROID_NDK_HOME=/home/username/ndk
Πρέπει επίσης να κατεβάσετε το NDK από τον επίσημο ιστότοπο, να το αποσυμπιέσετε στον αρχικό σας κατάλογο και να το μετονομάσετε σε NDK. Στη συνέχεια, πρέπει να κάνετε λήψη της βιβλιοθήκης 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 μου
Πηγή: www.habr.com