เบเบณเบฅเบฑเบ‡เบเบฐเบเบฝเบกเป‚เบ„เบ‡เบเบฒเบ™ SDL2 เป€เบžเบทเปˆเบญเปเบฅเปˆเบ™เปƒเบ™ Android

เบชเบฐเบšเบฒเบเบ”เบตเบ—เบธเบเบ„เบปเบ™. เบกเบทเป‰เบ™เบตเป‰เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเป€เบšเบดเปˆเบ‡เบงเบดเบ—เบตเบเบฒเบ™เบเบฐเบเบฝเบกเป‚เบ„เบ‡เบเบฒเบ™เป‚เบ”เบเปƒเบŠเป‰เบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ” sdl2 เป€เบžเบทเปˆเบญเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เป€เบเบกเปƒเบ™ Android.

เบเปˆเบญเบ™เบญเบทเปˆเบ™ เปเบปเบ” เบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบ”เบฒเบงเป‚เบซเบฅเบ” Android Studio, เบ•เบดเบ”เบ•เบฑเป‰เบ‡เบกเบฑเบ™เปเบฅเบฐเบ—เบธเบเบขเปˆเบฒเบ‡เบ—เบตเปˆเบ•เป‰เบญเบ‡เบเบฒเบ™เปƒเบ™เบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบกเบเบฒเบ™เบžเบฑเบ”เบ—เบฐเบ™เบฒเบ™เบตเป‰. เบ•เบปเบงเบขเปˆเบฒเบ‡, เบ•เบญเบ™เบ™เบตเป‰เบ‚เป‰เบญเบเบกเบต Kde Neon, เปเบฅเบฐเปƒเบ™เบฅเบฐเบšเบปเบšเบ™เบตเป‰เบกเบตเป„เบŸเบฅเปŒ /etc/environment, เป„เบŸเบฅเปŒเบ”เบฝเบงเบเบฑเบ™เบกเบตเบขเบนเปˆเปƒเบ™ ubuntu. เบ•เบปเบงเปเบ›เบ•เปเปˆเป„เบ›เบ™เบตเป‰เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป„เบ”เป‰เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบšเปˆเบญเบ™เบ™เบฑเป‰เบ™.

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

เบ™เบญเบเบ™เบฑเป‰เบ™เบ—เปˆเบฒเบ™เบเบฑเบ‡เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป„เบ”เป‰เบ”เบฒเบงเบ™เปŒเป‚เบซเบฅเบ” NDK เบˆเบฒเบเป€เบงเบฑเบšเป„เบŠเบ—เปŒเบ—เบฒเบ‡เบเบฒเบ™, unpack เบกเบฑเบ™เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เป„เบ”เป€เบฅเบเบฐเบ—เปเบฅเบตเป€เบฎเบทเบญเบ™เบ‚เบญเบ‡เบ—เปˆเบฒเบ™เปเบฅเบฐเบ›เปˆเบฝเบ™เบŠเบทเปˆเบกเบฑเบ™เป€เบ›เบฑเบ™ 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. เป€เบžเบทเปˆเบญเป€เบฎเบฑเบ”เบชเบดเปˆเบ‡เบ™เบตเป‰, เบ–เบญเบ”เปเบŸเป‰เบก 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, เปเบšเบš 3D).

เบ•เบญเบ™เบ™เบตเป‰เปƒเบซเป‰เป€เบฎเบปเบฒเบ•เบฑเป‰เบ‡เบ„เปˆเบฒ Freetype2 เบชเปเบฒเบฅเบฑเบš Android. เบ”เบฒเบงเป‚เบซเบฅเบ”เบˆเบฒเบ github เบ‚เบญเบ‡เบ‚เป‰เบญเบ เบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆ, เปเบฅเบฐเบ„เบฑเบ”เบฅเบญเบเป„เบ”เป€เบฅเบเบฐเบ—เปเบฅเบต Freetype2 เป„เบ›เบ—เบตเปˆ app/jni/ directory. เบ—เบฑเบ‡เบซเบกเบปเบ”เปเบกเปˆเบ™เบเบฝเบกเบžเป‰เบญเบก. เบ•เบญเบ™เบ™เบตเป‰เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบ„เปเบฒเบชเบฑเปˆเบ‡ ./gradlew installDebug เปƒเบ™ com.xverizex.test. เป€เบžเบทเปˆเบญเปƒเบซเป‰เบชเบฒเบกเบฒเบ”เป€เบžเบตเปˆเบกเป€เบเบกเบ™เบตเป‰เปƒเบชเปˆ Android เป„เบ”เป‰, เบเบฒเบ™เบ”เบตเบšเบฑเบเบˆเบฐเบ•เป‰เบญเบ‡เบ–เบทเบเป€เบ›เบตเบ”เปƒเบŠเป‰เปƒเบ™ android. เป€เบžเบทเปˆเบญเป€เบฎเบฑเบ”เบชเบดเปˆเบ‡เบ™เบตเป‰, เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป„เบ›เบ—เบตเปˆเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ, เป„เบ›เบ—เบตเปˆ "เบฅเบฐเบšเบปเบš", เป„เบ›เบ—เบตเปˆ "เบเปˆเบฝเบงเบเบฑเบšเปเบ—เบฑเบšเป€เบฅเบฑเบ”" เปเบฅเบฐเบเบปเบ”เบ›เบธเปˆเบก "เบชเป‰เบฒเบ‡เบˆเปเบฒเบ™เบงเบ™" เบ›เบฐเบกเบฒเบ™เบซเบปเบเป€เบ—เบทเปˆเบญ. เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™, เบเบฑเบšเบ„เบทเบ™เป„เบ›เบšเปˆเบญเบ™เปเบฅเบฐเบ—เบฒเบ‡เป€เบฅเบทเบญเบเบชเปเบฒเบฅเบฑเบšเบ™เบฑเบเบžเบฑเบ”เบ—เบฐเบ™เบฒเบˆเบฐเบ›เบฒเบเบปเบ”. เป€เบ‚เบปเป‰เบฒเป„เบ› เปเบฅเบฐเป€เบ›เบตเบ”เบกเบฑเบ™, เป€เบ›เบตเบ”เบ•เบปเบงเป€เบฅเบทเบญเบ โ€œเบเบฒเบ™เบ”เบตเบšเบฑเบ USBโ€ เบ™เบณ. เปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป„เบ”เป‰เบเบฐเปเบˆเบชเปเบฒเบฅเบฑเบšเปเบ—เบฑเบšเป€เบฅเบฑเบ”. เป€เบžเบทเปˆเบญเป€เบฎเบฑเบ”เบชเบดเปˆเบ‡เบ™เบตเป‰, เบ•เบดเบ”เบ•เบฑเป‰เบ‡เป‚เบ›เปเบเบผเบก adb. เบžเบงเบเป€เบฎเบปเบฒเป€เบ›เบตเบ”เบ•เบปเบง adb shell เปƒเบ™ console, เปเบฅเบฐเบฅเบฐเบซเบฑเบ”เบˆเบฐเบ›เบฒเบเบปเบ”เบขเบนเปˆเปƒเบ™เปเบ—เบฑเบšเป€เบฅเบฑเบ”เบ—เบตเปˆเบ•เป‰เบญเบ‡เป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบเบญเบกเบฎเบฑเบš. เบ™เบฑเป‰เบ™โ€‹เปเบกเปˆเบ™โ€‹เบกเบฑเบ™โ€‹, เปƒเบ™โ€‹เบ›เบฑเบ”โ€‹เบˆเบธโ€‹เบšเบฑเบ™โ€‹เป€เบเบกโ€‹เบชเบฒโ€‹เบกเบฒเบ”โ€‹เบ”เบฒเบงโ€‹เป‚เบซเบฅเบ”โ€‹เป„เบ›โ€‹เปƒเบ™โ€‹เปเบ—เบฑเบšโ€‹เป€เบฅเบฑเบ”โ€‹เบ‚เบญเบ‡โ€‹เบ—เปˆเบฒเบ™โ€‹.

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™