Android เชชเชฐ เชšเชฒเชพเชตเชตเชพ เชฎเชพเชŸเซ‡ SDL2 เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เชคเซˆเชฏเชพเชฐ เช•เชฐเซ€ เชฐเชนเซเชฏเชพเช‚ เช›เซ€เช

เช•เซ‡เชฎ เช›เซ‹ เชฌเชงเชพ. เช†เชœเซ‡ เช†เชชเชฃเซ‡ Android เชชเชฐ เช—เซ‡เชฎ เชšเชฒเชพเชตเชตเชพ เชฎเชพเชŸเซ‡ sdl2 เชฒเชพเช‡เชฌเซเชฐเซ‡เชฐเซ€เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชคเซˆเชฏเชพเชฐ เช•เชฐเชตเซ‹ เชคเซ‡ เชœเซ‹เชˆเชถเซเช‚.

เชชเซเชฐเชฅเชฎ เชคเชฎเชพเชฐเซ‡ Android เชธเซเชŸเซเชกเชฟเชฏเซ‹ เชกเชพเช‰เชจเชฒเซ‹เชก เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡, เชคเซ‡เชจเซ‡ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเซ‹ เช…เชจเซ‡ เช† เชตเชฟเช•เชพเชธ เชตเชพเชคเชพเชตเชฐเชฃเชฎเชพเช‚ เชœเชฐเซ‚เชฐเซ€ เช›เซ‡ เชคเซ‡ เชฌเชงเซเช‚. เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เชฎเชพเชฐเซ€ เชชเชพเชธเซ‡ เชนเชตเซ‡ Kde Neon เช›เซ‡, เช…เชจเซ‡ เช† เชธเชฟเชธเซเชŸเชฎ เชชเชฐ เชซเชพเช‡เชฒ /etc/environment เช›เซ‡, เชคเซ‡ เชœ เชซเชพเช‡เชฒ เช‰เชฌเซเชจเซเชŸเซเชฎเชพเช‚ เช…เชธเซเชคเชฟเชคเซเชตเชฎเชพเช‚ เช›เซ‡. เชจเซ€เชšเซ‡เชจเชพ เชšเชฒเซ‹เชจเซ‡ เชคเซเชฏเชพเช‚ เชฆเชพเช–เชฒ เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡.

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

เชคเชฎเชพเชฐเซ‡ เชธเชคเซเชคเชพเชตเชพเชฐ เชตเซ‡เชฌเชธเชพเช‡เชŸ เชชเชฐเชฅเซ€ NDK เชกเชพเช‰เชจเชฒเซ‹เชก เช•เชฐเชตเชพเชจเซ€ เชชเชฃ เชœเชฐเซ‚เชฐ เช›เซ‡, เชคเซ‡เชจเซ‡ เชคเชฎเชพเชฐเซ€ เชนเซ‹เชฎ เชกเชฟเชฐเซ‡เช•เซเชŸเชฐเซ€เชฎเชพเช‚ เช…เชจเชชเซ…เช• เช•เชฐเซ‹ เช…เชจเซ‡ เชคเซ‡เชจเซเช‚ เชจเชพเชฎ NDK เชฐเชพเช–เซ‹. เช†เช—เชณ เชคเชฎเชพเชฐเซ‡ เชตเซ‡เชฌเชธเชพเช‡เชŸ เชชเชฐเชฅเซ€ SDL2 เชฒเชพเช‡เชฌเซเชฐเซ‡เชฐเซ€ เชกเชพเช‰เชจเชฒเซ‹เชก เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡ libsdl.org. เชเชจเซเชกเซเชฐเซ‹เช‡เชก เชฎเชพเชŸเซ‡ sdl2 เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡, เชคเซ‡เชจเซ‡ เช•เชฎเซเชชเซเชฏเซเชŸเชฐ เชฎเชพเชŸเซ‡ เช•เชฎเซเชชเชพเช‡เชฒ เชจ เช•เชฐเชตเซเช‚ เชฎเชนเชคเซเชตเชชเซ‚เชฐเซเชฃ เช›เซ‡, เช•เชพเชฐเชฃ เช•เซ‡ เชชเช›เซ€ เชคเซ‡ เชเชจเซเชกเซเชฐเซ‹เช‡เชก เชฎเชพเชŸเซ‡ เช•เชฎเซเชชเชพเช‡เชฒ เช•เชฐเชถเซ‡ เชจเชนเซ€เช‚. เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸเชจเซ‡ เช•เชฎเซเชชเชพเชˆเชฒ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡, เชคเชฎเชพเชฐเซ‡ เชฒเชพเชฏเชธเชจเซเชธ เชธเซเชตเซ€เช•เชพเชฐเชตเชพ เชฎเชพเชŸเซ‡, Android เชธเซเชŸเซเชกเชฟเชฏเซ‹เชฎเชพเช‚ เช•เซ‹เชˆเชชเชฃ เชเช• เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เชฌเชจเชพเชตเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡, เช…เชจเซเชฏเชฅเชพ SDL2 เชœเซเชฏเชพเชฐเซ‡ เชจเชฟเชฐเซเชฎเชพเชฃ เช•เชฐเซ‡ เช›เซ‡ เชคเซเชฏเชพเชฐเซ‡ เชฒเชพเช‡เชธเชจเซเชธ เชฎเชพเชŸเซ‡ เชชเซ‚เช›เชถเซ‡.

เชเชธเซ‡เชŸเซเชธเชฎเชพเช‚เชฅเซ€ เชเชจเซเชกเซเชฐเซ‹เช‡เชกเชฎเชพเช‚ เชซเชพเช‡เชฒเซ‹ เชตเชพเช‚เชšเชตเชพ เชฎเชพเชŸเซ‡, เชคเชฎเชพเชฐเซ‡ 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 เชœเชฐเซ‚เชฐเซ€ เช›เซ‡.

#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

เชคเซ‡เชฅเซ€ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เชคเซˆเชฏเชพเชฐ เช›เซ‡, Opengl Es 3.0 เชฎเชพเชŸเซ‡ เชถเซ‡เชกเชฐเซเชธ เชคเซˆเชฏเชพเชฐ เช›เซ‡. เชนเชตเซ‡ เช†เชชเชฃเซ‡ เชเชจเซเชกเซเชฐเซ‹เช‡เชก-เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เชฌเชจเชพเชตเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡. เช† เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡, SDL2 เช†เชฐเซเช•เชพเช‡เชตเชจเซ‡ เช…เชจเชชเซ‡เช• เช•เชฐเซ‹. เชฌเชฟเชฒเซเชก-เชธเซเช•เซเชฐเซ€เชชเซเชŸ เชชเชฐ เชœเชพเช“. เช…เชจเซ‡ เช…เชฎเซ‡ เชคเซ‡เชจเซ‡ เช† เชฐเซ€เชคเซ‡ เช•เชฐเซ€เช เช›เซ€เช.

./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)

เชœเซ‡เชฎ เชคเชฎเซ‡ เชชเชนเซ‡เชฒเซ‡เชฅเซ€ เชœ เชจเซ‹เช‚เชงเซเชฏเซเช‚ เชนเชถเซ‡, เชนเซเช‚ เชซเซเชฐเซ€เชŸเชพเช‡เชช 2 เชฒเชพเช‡เชฌเซเชฐเซ‡เชฐเซ€เชจเซ‹ เชชเชฃ เชธเชฎเชพเชตเซ‡เชถ เช•เชฐเซเช‚ เช›เซเช‚. เชฎเชจเซ‡ เชเชจเซเชกเซเชฐเซ‹เช‡เชก เชฎเชพเชŸเซ‡ เช—เซ€เชฅเชฌ เชชเชฐ เชคเซˆเชฏเชพเชฐ เชเช• เชฎเชณเซเชฏเซเช‚, เชชเชฐเช‚เชคเซ เชคเซ‡ เช•เชพเชฎ เช•เชฐเชคเซเช‚ เชจเชฅเซ€, เชฎเชพเชฐเซ‡ เช•เช‚เชˆเช• เชฌเชฆเชฒเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡. เช…เชฎเซ‡ เชกเชฟเชฐเซ‡เช•เซเชŸเชฐเซ€ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจ/src/main/assets เชชเชฃ เชฌเชจเชพเชตเซ€เช เช›เซ€เช. เช…เชฎเซ‡ เชคเซ‡เชฎเชพเช‚ เช…เชฎเชพเชฐเชพ เชธเช‚เชธเชพเชงเชจเซ‹ เชฎเซ‚เช•เซ€เช เช›เซ€เช (เชซเซ‹เชจเซเชŸเซเชธ, เชธเซเชชเซเชฐเชพเช‰เชŸเซเชธ, 3D เชฎเซ‹เชกเชฒ).

เชนเชตเซ‡ เชšเชพเชฒเซ‹ Android เชฎเชพเชŸเซ‡ Freetype2 เชจเซ‡ เช—เซ‹เช เชตเซ€เช. เชฎเชพเชฐเชพ เช—เซ€เชฅเชฌ เชชเชฐเชฅเซ€ เชกเชพเช‰เชจเชฒเซ‹เชก เช•เชฐเซ‹ เชฒเชฟเช‚เช•, เช…เชจเซ‡ Freetype2 เชกเชฟเชฐเซ‡เช•เซเชŸเชฐเซ€เชจเซ‡ app/jni/ เชกเชฟเชฐเซ‡เช•เซเชŸเชฐเซ€เชฎเชพเช‚ เช•เซ‰เชชเชฟ เช•เชฐเซ‹. เชฌเชงเซเช‚ เชคเซˆเชฏเชพเชฐ เช›เซ‡. เชนเชตเซ‡ com.xverizex.test เชฎเชพเช‚ ./gradlew installDebug เช†เชฆเซ‡เชถ เชšเชฒเชพเชตเซ‹. เช† เช—เซ‡เชฎเชจเซ‡ เชเชจเซเชกเซเชฐเซ‹เช‡เชกเชฎเชพเช‚ เช‰เชฎเซ‡เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชธเช•เซเชทเชฎ เชฅเชตเชพ เชฎเชพเชŸเซ‡, เชเชจเซเชกเซเชฐเซ‹เช‡เชกเชฎเชพเช‚ เชกเซ€เชฌเช—เซ€เช‚เช— เชธเช•เซเชทเชฎ เชนเซ‹เชตเซเช‚ เช†เชตเชถเซเชฏเช• เช›เซ‡. เช† เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡, เชคเชฎเชพเชฐเซ‡ เชธเซ‡เชŸเชฟเช‚เช—เซเชธเชฎเชพเช‚ เชœเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡, "เชธเชฟเชธเซเชŸเชฎ" เชชเชฐ เชœเชพเช“, "เชŸเซ‡เชฌเซเชฒเซ‡เชŸ เชตเชฟเชถเซ‡" เชชเชฐ เชœเชพเช“ เช…เชจเซ‡ เชฒเช—เชญเช— เช› เชตเช–เชค "เชฌเชฟเชฒเซเชก เชจเช‚เชฌเชฐ" เชตเชฟเช•เชฒเซเชช เชชเชฐ เช•เซเชฒเชฟเช• เช•เชฐเซ‹. เชชเช›เซ€ เชชเชพเช›เชพ เชœเชพเช“ เช…เชจเซ‡ เชตเชฟเช•เชพเชธเช•เชฐเซเชคเชพเช“ เชฎเชพเชŸเซ‡ เชตเชฟเช•เชฒเซเชช เชฆเซ‡เช–เชพเชถเซ‡. เช…เช‚เชฆเชฐ เชœเชพเช“ เช…เชจเซ‡ เชคเซ‡เชจเซ‡ เชšเชพเชฒเซ เช•เชฐเซ‹, "USB เชกเซ€เชฌเช—เซ€เช‚เช—" เชตเชฟเช•เชฒเซเชช เชชเชฃ เชšเชพเชฒเซ เช•เชฐเซ‹. เชนเชตเซ‡ เชคเชฎเชพเชฐเซ‡ เชŸเซ‡เชฌเซเชฒเซ‡เชŸ เชฎเชพเชŸเซ‡ เช•เซ€ เชฎเซ‡เชณเชตเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡. เช† เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡, เชเชกเซ€เชฌเซ€ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเซ‹. เช…เชฎเซ‡ เช•เชจเซเชธเซ‹เชฒเชฎเชพเช‚ adb เชถเซ‡เชฒ เชฒเซ‹เชจเซเชš เช•เชฐเซ€เช เช›เซ€เช, เช…เชจเซ‡ เชŸเซ‡เชฌเซเชฒเซ‡เชŸเชฎเชพเช‚ เชเช• เช•เซ€ เชฆเซ‡เช–เชพเชฏ เช›เซ‡ เชœเซ‡ เชธเซเชตเซ€เช•เชพเชฐเชตเซ€ เช†เชตเชถเซเชฏเช• เช›เซ‡. เชฌเชธ, เชนเชตเซ‡ เชคเชฎเชพเชฐเชพ เชŸเซ‡เชฌเซเชฒเซ‡เชŸ เชชเชฐ เช—เซ‡เชฎเซเชธ เชกเชพเช‰เชจเชฒเซ‹เชก เช•เชฐเซ€ เชถเช•เชพเชฏ เช›เซ‡.

เชธเซ‹เชฐเซเชธ: www.habr.com

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹