ΠŸΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ° Π½Π° 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

Π’Π°ΠΊΠ° Ρ‡Π΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΡŠΡ‚ Π΅ Π³ΠΎΡ‚ΠΎΠ², ΡˆΠ΅ΠΉΠ΄ΡŠΡ€ΠΈΡ‚Π΅ са Π³ΠΎΡ‚ΠΎΠ²ΠΈ Π·Π° 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. НиС Π²Π»Π°Π³Π°ΠΌΠ΅ Π½Π°ΡˆΠΈΡ‚Π΅ рСсурси Π² Π½Π΅Π³ΠΎ (ΡˆΡ€ΠΈΡ„Ρ‚ΠΎΠ²Π΅, спрайтовС, 3D ΠΌΠΎΠ΄Π΅Π»ΠΈ).

Π‘Π΅Π³Π° Π½Π΅ΠΊΠ° настроим Freetype2 Π·Π° Android. Π˜Π·Ρ‚Π΅Π³Π»Π΅Ρ‚Π΅ ΠΎΡ‚ моя github Π²Ρ€ΡŠΠ·ΠΊΠ°ΠΈ ΠΊΠΎΠΏΠΈΡ€Π°ΠΉΡ‚Π΅ дирСкторията Freetype2 Π² дирСкторията app/jni/. Всичко Π΅ Π³ΠΎΡ‚ΠΎΠ²ΠΎ. Π‘Π΅Π³Π° изпълнявамС ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π° ./gradlew installDebug Π² com.xverizex.test. Π—Π° Π΄Π° ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π΄ΠΎΠ±Π°Π²ΠΈΡ‚Π΅ Ρ‚Π°Π·ΠΈ ΠΈΠ³Ρ€Π° към android, отстраняванСто Π½Π° Π³Ρ€Π΅ΡˆΠΊΠΈ трябва Π΄Π° Π΅ Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€Π°Π½ΠΎ Π² android. Π—Π° Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΡ‚Π΅ Ρ‚ΠΎΠ²Π°, трябва Π΄Π° ΠΎΡ‚ΠΈΠ΄Π΅Ρ‚Π΅ Π² настройкитС, ΠΎΡ‚ΠΈΠ΄Π΅Ρ‚Π΅ Π½Π° β€žΠ‘ΠΈΡΡ‚Π΅ΠΌΠ°β€œ, ΠΎΡ‚ΠΈΠ΄Π΅Ρ‚Π΅ Π½Π° β€žΠ—Π° Ρ‚Π°Π±Π»Π΅Ρ‚Π°β€œ ΠΈ ΠΊΠ»ΠΈΠΊΠ½Π΅Ρ‚Π΅ Π²ΡŠΡ€Ρ…Ρƒ опцията β€žΠΠΎΠΌΠ΅Ρ€ Π½Π° ΠΊΠΎΠΌΠΏΠΈΠ»Π°Ρ†ΠΈΡβ€œ ΠΎΠΊΠΎΠ»ΠΎ ΡˆΠ΅ΡΡ‚ ΠΏΡŠΡ‚ΠΈ. Π‘Π»Π΅Π΄ Ρ‚ΠΎΠ²Π° сС Π²ΡŠΡ€Π½Π΅Ρ‚Π΅ ΠΈ Ρ‰Π΅ сС появи опцията Π·Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΡ†ΠΈ. Π’Π»ΠΈΠ·Π°ΠΌΠ΅ ΠΈ Π³ΠΎ Π²ΠΊΠ»ΡŽΡ‡Π²Π°ΠΌΠ΅, ΡΡŠΡ‰ΠΎ Ρ‚Π°ΠΊΠ° Π²ΠΊΠ»ΡŽΡ‡Π²Π°ΠΌΠ΅ опцията "ΠžΡ‚ΡΡ‚Ρ€Π°Π½ΡΠ²Π°Π½Π΅ Π½Π° Π³Ρ€Π΅ΡˆΠΊΠΈ Ρ‡Ρ€Π΅Π· USB". Π‘Π΅Π³Π° трябва Π΄Π° Π²Π·Π΅ΠΌΠ΅ΠΌ ΠΊΠ»ΡŽΡ‡Π° Π·Π° Ρ‚Π°Π±Π»Π΅Ρ‚Π°. Π—Π° Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΡ‚Π΅ Ρ‚ΠΎΠ²Π°, инсталирайтС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π° adb. Π‘Ρ‚Π°Ρ€Ρ‚ΠΈΡ€Π°ΠΌΠ΅ adb shell Π² ΠΊΠΎΠ½Π·ΠΎΠ»Π°Ρ‚Π° ΠΈ Π½Π° Ρ‚Π°Π±Π»Π΅Ρ‚Π° сС появява ΠΊΠ»ΡŽΡ‡, ΠΊΠΎΠΉΡ‚ΠΎ трябва Π΄Π° бъдС ΠΏΡ€ΠΈΠ΅Ρ‚. Всичко, сСга ΠΈΠ³Ρ€ΠΈΡ‚Π΅ ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° Π±ΡŠΠ΄Π°Ρ‚ ΠΈΠ·Ρ‚Π΅Π³Π»Π΅Π½ΠΈ Π½Π° Ρ‚Π°Π±Π»Π΅Ρ‚Π°.

Π˜Π·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ: www.habr.com

ДобавянС Π½Π° Π½ΠΎΠ² ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€