Подготовка SDL2-проекта для запуска на android

  • Tutorial
Всем привет. Сегодня мы посмотрим как подготовить проект с использованием библиотеки 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: %s\n", 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, и в планшете появляется ключ, который надо принять. Всё, теперь игры можно загружать на планшет.
AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее
Реклама

Комментарии 4

    +1
    Опять рисуем сову. Где детали-то? Шрифты хорошо, а где звук, png и всё такое.
      0
      Мда, я что-то об этом и не подумал. У меня этого в проекте нет, и я забыл об этом. Ну насчёт звука это понятно. Но зачем png? У меня есть утилита, которая переводит в собственный формат изображения png, чтобы рисунки было удобно загружать в игру. Ну в принципе, если посмотреть на то, как у меня сделана настройка Freetype2, можно сделать настройки с аналогичными библиотеками.
        0
        Там же mixer, image и в них плагины (external): ogg, vorbis, zlib, mgp123, webp, png, и т.п.
        И потом надо собрать под mips,arm,arm64,x86 или всё само?
          0
          Ну я как помню что если подключить SDL_mixer, то других зависимостей не нужно, но звук вроде будет только wav, про ogg не знаю. Под все платформы собирается само, главное указать архитектуры, но обычно можно взять готовый файл из своего же sdl, где написаны все архитектуры.

    Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

    Самое читаемое