ΠŸΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ° 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 ΠΈΠ· assets, Π½ΡƒΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ 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-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. Π’ Π½Π΅Π³ΠΎ ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅ΠΌ наши рСсурсы ( ΡˆΡ€ΠΈΡ„Ρ‚Ρ‹, спрайты, 3d модСльки ).

Π’Π΅ΠΏΠ΅Ρ€ΡŒ настроим Freetype2 для Android. Π‘ΠΊΠ°Ρ‡ΠΈΠ²Π°Π΅ΠΌ с ΠΌΠΎΠ΅Π³ΠΎ github Link, ΠΈ ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅ΠΌ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ Freetype2 Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ app/jni/. Всё Π³ΠΎΡ‚ΠΎΠ²ΠΎ. Π’Π΅ΠΏΠ΅Ρ€ΡŒ запускаСм Π² com.xverizex.test ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ ./gradlew installDebug. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π² android эту ΠΈΠ³Ρ€Ρƒ, Π² android Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π° ΠΎΡ‚Π»Π°Π΄ΠΊΠ°. Для этого Π½ΡƒΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ Π² настройки, ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ Π² «БистСма», ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ Π² «О ΠΏΠ»Π°Π½ΡˆΠ΅Ρ‚Π΅Β» ΠΈ Π½Π°ΠΆΠ°Ρ‚ΡŒ ΠΎΠΊΠΎΠ»ΠΎ ΡˆΠ΅ΡΡ‚ΠΈ Ρ€Π°Π· ΠΎΠΏΡ†ΠΈΡŽ «НомСр сборки». ΠŸΠΎΡ‚ΠΎΠΌ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ Π½Π°Π·Π°Π΄ ΠΈ ΠΏΠΎΡΠ²ΠΈΡ‚ΡŒΡΡ опция для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ². Π—Π°Ρ…ΠΎΠ΄ΠΈΠΌ ΠΈ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ, Ρ‚Π°ΠΊΠΆΠ΅ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ ΠΎΠΏΡ†ΠΈΡŽ Β«ΠžΡ‚Π»Π°Π΄ΠΊΠ° ΠΏΠΎ USBΒ». Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π½Π°Π΄ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΊΠ»ΡŽΡ‡ для ΠΏΠ»Π°Π½ΡˆΠ΅Ρ‚Π°. Для этого устанавливаСм ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ adb. ЗапускаСм Π² консоли adb shell, ΠΈ Π² ΠΏΠ»Π°Π½ΡˆΠ΅Ρ‚Π΅ появляСтся ΠΊΠ»ΡŽΡ‡, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π°Π΄ΠΎ ΠΏΡ€ΠΈΠ½ΡΡ‚ΡŒ. Всё, Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΈΠ³Ρ€Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒ Π½Π° ΠΏΠ»Π°Π½ΡˆΠ΅Ρ‚.

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