Paghahanda ng proyektong SDL2 na tatakbo sa Android

Kamusta kayong lahat. Ngayon ay titingnan natin kung paano maghanda ng isang proyekto gamit ang sdl2 library upang magpatakbo ng isang laro sa Android.

Una kailangan mong i-download ang Android Studio, i-install ito at lahat ng kailangan sa development environment na ito. Halimbawa, mayroon na akong Kde Neon, at sa sistemang ito mayroong isang file /etc/environment, ang parehong file ay umiiral sa ubuntu. Ang mga sumusunod na variable ay kailangang ipasok doon.

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

Kailangan mo ring i-download ang NDK mula sa opisyal na website, i-unpack ito sa iyong home directory at palitan ang pangalan nito sa NDK. Susunod na kailangan mong i-download ang SDL2 library mula sa website libsdl.org. Upang magamit ang sdl2 para sa android, mahalaga na huwag i-compile ito para sa computer, dahil hindi ito mag-compile para sa android. Upang ma-compile ang proyekto, kailangan mong lumikha ng isang proyekto sa android studio, kahit sino, upang tanggapin ang lisensya, kung hindi man ay hihingi ang SDL2 ng lisensya kapag nagtatayo.

Upang basahin ang mga file sa android mula sa mga asset, kailangan mong gamitin ang mga function ng SDL_RWops. Narito ang isang halimbawa ng paggamit sa code para sa pagtatrabaho sa isang font. Sa kasong ito, hindi namin magagamit ang FT_New_Face, ngunit sa halip ay gagamitin ang FT_New_Memory_Face upang gamitin ang data na nabasa na.

#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

Gumawa din ako ng isang header file upang ikonekta ang mga header ng SDL2. NO_SDL_GLEXT ang kailangan para magtagumpay ang compilation sa 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

Kaya handa na ang proyekto, handa na ang mga shader para sa Opengl Es 3.0. Ngayon kailangan naming lumikha ng isang android-proyekto. Upang gawin ito, i-unpack ang archive ng SDL2. Pumunta sa build-scripts. At ginagawa namin ito ng ganito.

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

Lalabas ang sumusunod na mensahe.

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

Pumunta sa com.xverizex.test. Pumunta sa com.xverizex.test/app/jni/src. Kinopya namin ang aming proyekto sa laro. At binago namin ang Android.mk file, sa aking kaso ganito ang hitsura.

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)

Tulad ng maaaring napansin mo na, kasama ko rin ang Freetype2 library. Nakakita ako ng handa sa github para sa android, ngunit hindi ito gumana, kailangan kong baguhin ang isang bagay. Gumagawa din kami ng isang direktoryo na app/src/main/assets. Inilalagay namin ang aming mga mapagkukunan dito (mga font, sprite, 3D na modelo).

Ngayon ay i-configure natin ang Freetype2 para sa Android. I-download mula sa aking github link, at kopyahin ang direktoryo ng Freetype2 sa direktoryo ng app/jni/. Handa na ang lahat. Ngayon patakbuhin ang command na ./gradlew installDebug sa com.xverizex.test. Upang maidagdag ang larong ito sa android, dapat paganahin ang pag-debug sa android. Upang gawin ito, kailangan mong pumunta sa mga setting, pumunta sa "System", pumunta sa "Tungkol sa tablet" at i-click ang opsyon na "Build number" nang halos anim na beses. Pagkatapos ay bumalik at lalabas ang opsyon para sa mga developer. Pumasok at i-on ito, i-on din ang opsyong "USB Debugging". Ngayon ay kailangan mong kumuha ng susi para sa tablet. Upang gawin ito, i-install ang adb program. Inilunsad namin ang adb shell sa console, at may lalabas na key sa tablet na dapat tanggapin. Iyon lang, maaari nang ma-download ang mga laro sa iyong tablet.

Pinagmulan: www.habr.com

Magdagdag ng komento