Port sdl to android

Building SDL2 for Android

Existing documentation

A lot of information can be found in SDL/docs/README-android.md.

This page is more walkthrough-oriented.

Pre-requisites

* Install minimal Java environment. For instance, in Debian/Ubuntu:

  • Install NDK (tested with r10e)
  • Install the latest SDK, run tools/bin/sdkmanager (or tools/android pre-2017) and install one API (>=12; >= 19 for SDL >= 2.0.8; >=26 if for SDL >= 2.0.9)

* Configure your environment variables, e.g.:

Simple builds

SDL wrapper for simple programs

  • Compile a sample app (calls ndk-build):
  • Follow the instructions to install on your device:
  • multiple targets armeabi-v7a/arm64-v8a/x86/x86_64 compilation
  • application doesn’t quit

Troubleshooting

  • use OpenJDK 8: execute «`sudo update-alternatives —config java«` and select jdk-8 as default; or use
  • fixed in 2.0.9: in «`/android-project/build.gradle«` change (in BOTH places in the file code appears) from

repositories <
jcenter()
google()
>

  • «`javax/xml/bind/annotation/XmlSchema«`, : check the Android Gradle Plugin version in , e.g.
  • You can customize the Gradle version in «`/android-project/gradle/wrapper/gradle-wrapper.properties«`:
  • You can customize your SDK/NDK versions in «`android-project/app/build.gradle«`: <<<

buildToolsVersion «28.0.1»
compileSdkVersion 28

  • You can customize your targets depending on the NDK version: «`

externalNativeBuild <
ndkBuild <
arguments «APP_PLATFORM=android-14»
abiFilters ‘armeabi-v7a’, ‘arm64-v8a’, ‘x86’, ‘x86_64’

  • «`ABIs [x86_64, arm64-v8a] are not supported for platform. Supported ABIs are [armeabi, armeabi-v7a, x86, mips]«`: upgrade to NDK >= 10
  • Using ant (SDL SDL2_image/showimage.c to show a simple embedded image (e.g. XPM).

Then let’s make an Android app out of it. To compile:

  • application doesn’t restart properly

Build an autotools-friendly environment

You use autotools in your project and can’t be bothering understanding ndk-build’s cryptic errors? This guide is for you!

Note: this environment can be used for CMake too.

Compile a shared binaries bundle for SDL and SDL_*

  • Get the latests SDL2_* releases: «`

tar xf SDL2-2.0.5.tar.gz tar xf SDL2_image-2.0.1.tar.gz tar xf SDL2_mixer-2.0.1.tar.gz tar xf SDL2_net-2.0.1.tar.gz tar xf SDL2_ttf-2.0.14.tar.gz

ln -s SDL2-2.0.5 SDL2 ln -s SDL2_image-2.0.1 SDL2_image ln -s SDL2_mixer-2.0.1 SDL2_mixer ln -s SDL2_net-2.0.1 SDL2_net ln -s SDL2_ttf-2.0.14 SDL2_ttf «`

  • Start with a minimal build: «`

cd /usr/src/SDL2/ cd build-scripts/

  1. hg revert —all # remove traces of previous builds
  2. edit androidbuild.sh and modify $ANDROID update project —target android-XX

./androidbuild.sh org.libsdl /dev/null

  1. doesn’t matter if the actual build fails, it’s just for setup
  • Remove reference to our dummy file: «`
  • Reference SDL_image, SDL_mixer, SDL_ttf, and their dependencies, as NDK modules: «`

ln -s /usr/src/SDL2_image jni/ ln -s /usr/src/SDL2_image/external/libwebp-0.3.0 jni/webp ln -s /usr/src/SDL2_mixer jni/ ln -s /usr/src/SDL2_mixer/external/libmikmod-3.1.12 jni/libmikmod ln -s /usr/src/SDL2_mixer/external/smpeg2-2.0.0 jni/smpeg2 ln -s /usr/src/SDL2_net jni/ ln -s /usr/src/SDL2_ttf jni/ «`

  • Optionnaly edit jni/Android.mk to disable some formats, e.g.: «`

SUPPORT_MP3_SMPEG := false include $(call all-subdir-makefiles) «`

Note: no need to add System.loadLibrary calls in SDLActivity.java , your application will be linked to them and Android’s ld-linux loads them automatically.

Install SDL in a GCC toolchain

  • Copy the NDK into a traditional GCC toolchain (leave android-14 as-is): «`

—platform=android-14 —install-dir=/usr/src/ndk-standalone-14-arm —arch=arm

  • Set your PATH (important, do it before any build): «`
  • Install the SDL2 binaries in the toolchain: «`

cd /usr/src/SDL2/build/org.libsdl/ for i in libs/armeabi/*; do ln -nfs $(pwd)/$i $NDK_STANDALONE/sysroot/usr/lib/; done mkdir $NDK_STANDALONE/sysroot/usr/include/SDL2/ \cp jni/SDL/include/* $NDK_STANDALONE/sysroot/usr/include/SDL2/ \cp jni/*/SDL*.h $NDK_STANDALONE/sysroot/usr/include/SDL2/ «`

  • Install pkg-config and install a host-triplet-prefixed symlink in the PATH (auto-detected by autoconf): «`

nenolod/distfiles/pkgconf-$VERSION.tar.gz tar xf pkgconf-$VERSION.tar.gz cd pkgconf-$VERSION/ mkdir native-android/ && cd native-android/ ../configure —prefix=$NDK_STANDALONE/sysroot/usr make -j$(nproc) make install ln -s ../sysroot/usr/bin/pkgconf $NDK_STANDALONE/bin/arm-linux-androideabi-pkg-config mkdir $NDK_STANDALONE/sysroot/usr/lib/pkgconfig/ «`

  • Install pkg-config .pc files for SDL: «`

cat $NDK_STANDALONE/sysroot/usr/lib/pkgconfig/sdl2.pc prefix=/usr/src/ndk-standalone-14-arm/sysroot/usr exec_prefix=$ libdir=$/lib includedir=$/include Name: sdl2 Description: Simple DirectMedia Layer is a cross-platform multimedia library designed to provide low level access to audio, keyboard, mouse, joystick, 3D hardware via OpenGL, and 2D video framebuffer. Version: 2.0.5 Requires: Conflicts: Libs: -lSDL2 Cflags: -I$/SDL2 -D_REENTRANT EOF

cat $NDK_STANDALONE/sysroot/usr/lib/pkgconfig/SDL2_image.pc prefix=/usr/src/ndk-standalone-14-arm/sysroot/usr exec_prefix=$ libdir=$/lib includedir=$/include Name: SDL2_image Description: image loading library for Simple DirectMedia Layer Version: 2.0.1 Requires: sdl2 >= 2.0.0 Libs: -L$ -lSDL2_image Cflags: -I$/SDL2 EOF

cat $NDK_STANDALONE/sysroot/usr/lib/pkgconfig/SDL2_mixer.pc prefix=/usr/src/ndk-standalone-14-arm/sysroot/usr exec_prefix=$ libdir=$/lib includedir=$/include Name: SDL2_mixer Description: mixer library for Simple DirectMedia Layer Version: 2.0.1 Requires: sdl2 >= 2.0.0 Libs: -L$ -lSDL2_mixer Cflags: -I$/SDL2 EOF

cat $NDK_STANDALONE/sysroot/usr/lib/pkgconfig/SDL2_net.pc prefix=/usr/src/ndk-standalone-14-arm/sysroot/usr exec_prefix=$ libdir=$/lib includedir=$/include Name: SDL2_net Description: net library for Simple DirectMedia Layer Version: 2.0.1 Requires: sdl2 >= 2.0.0 Libs: -L$ -lSDL2_net Cflags: -I$/SDL2 EOF

cat $NDK_STANDALONE/sysroot/usr/lib/pkgconfig/SDL2_ttf.pc prefix=/usr/src/ndk-standalone-14-arm/sysroot/usr exec_prefix=$ libdir=$/lib includedir=$/include Name: SDL2_ttf Description: ttf library for Simple DirectMedia Layer with FreeType 2 support Version: 2.0.14 Requires: sdl2 >= 2.0.0 Libs: -L$ -lSDL2_ttf Cflags: -I$/SDL2 EOF «`

Building other dependencies

You can add any other libraries (e.g.: SDL2_gfx, freetype, gettext, gmp. ) using commands like: «` mkdir cross-android/ && cd cross-android/ ../configure —host=arm-linux-androideabi —prefix=$NDK_STANDALONE/sysroot/usr \

—with-some-option —enable-another-option \
—disable-shared

make -j$(nproc) make install «`

Static builds ( —disable-shared ) are recommended for simplicity (no additional .so to declare).

Example with SDL2_gfx: «` VERSION=1.0.3 wget http://www.ferzkopp.net/Software/SDL2_gfx/SDL2_gfx-$VERSION.tar.gz tar xf SDL2_gfx-$VERSION.tar.gz mv SDL2_gfx-$VERSION/ SDL2_gfx/ cd SDL2_gfx/ mkdir cross-android/ && cd cross-android/ ../configure —host=arm-linux-androideabi —prefix=$NDK_STANDALONE/sysroot/usr \

make -j$(nproc) make install «`

You can compile YOUR application using this technique, with some more steps to tell Android how to run it using JNI.

Build your autotools app

First, prepare an Android project:

  • Copy and adapt the /usr/src/SDL2/android-project skeleton as explained in README-android.md . You can leave it as-is in a first step.
  • Make links to the SDL binaries as well: «`

mkdir -p libs/armeabi/ for i in /usr/src/SDL2/build/org.libsdl/libs/armeabi/*; do ln -nfs $i libs/armeabi/; done «`

Make your project Android-aware:

  • Add /usr/src/SDL2/src/main/android/SDL_android_main.c in your project (comment out the line referencing «SDL_internal.h»). Compile it as C (not C++).
  • In your «`configure.ac«`, detect Android: <<<

AM_CONDITIONAL(ANDROID, test «$host» = «arm-unknown-linux-androideabi») >>>

  • In your «`Makefile.am«`, tell Automake you’ll build executables as libraries, using something like: <<<

AM_CFLAGS = -fPIC
AM_LDFLAGS += -shared
COMMON_OBJS += SDL_android_main.c

  • Cross-compile your project using the GCC toolchain environment we created: «`

PATH=$NDK_STANDALONE/bin:$PATH mkdir cross-android/ && cd cross-android/ ../configure —host=arm-linux-androideabi \

—prefix=/android-aint-posix \
—with-your-option —enable-your-other-option .

  • Do this again for any additional arch you want to support (TODO: see how to support armeabi-v7a and document what devices support it); something like: «`

mkdir cross-android-v7a/ && cd cross-android-v7a/

  1. .o: -march=armv5te -mtune=xscale -msoft-float -mthumb => -march=armv7-a -mfpu=vfpv3-d16 -mfloat-abi=softfp -mthumb
  2. .so: -march=armv7-a -Wl,—fix-cortex-a8

CFLAGS=»-g -O2 -march=armv7-a -mfpu=vfpv3-d16 -mfloat-abi=softfp -mthumb» LFDLAGS=»-march=armv7-a -Wl,—fix-cortex-a8″ \

Now you can install your pre-built binaries and build the Android project:

  • Copy your program in android-project/libs/armeabi/libmain.so .
  • Build your Android .apk : «`

android update project —name your_app —path . —target android-XX ant debug ant installd «`

  • You can run the application remotely: «`

adb shell am start -a android.intenon.MAIN -n org.libsdl.app/org.libsdl.app.SDLActivity # replace with your app package «`

  • Your SDL2 Android app is running!

Build your CMake app

(Work In Progress)

You can use our Android GCC toolchain using a simple toolchain file: «`

SET(CMAKE_SYSTEM_NAME Linux) # Tell CMake we’re cross-compiling include(CMakeForceCompiler)

  1. Prefix detection only works with compiler id «GNU»

CMAKE_FORCE_C_COMPILER(arm-linux-androideabi-gcc GNU) SET(ANDROID TRUE) «`

You then call CMake like this: «` PATH=$NDK_STANDALONE/bin:$PATH cmake \

Troubleshootings

If «`ant installd«` categorically refuses to install with , even if you have free local storage, that may mean anything. Check logcat first: If the error logs are not helpful (likely ;’)) try locating all past traces of the application: «` find / -name «org. » «` and remove them all.

Источник

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

Всем привет. Сегодня мы посмотрим как подготовить проект с использованием библиотеки sdl2 для запуска игры на android.

Для начала надо скачать Android Studio, установить её и всё что требуется в этой среде для разработки. Например у меня сейчас Kde Neon, и в этой системе существует файл /etc/environment, такой же файл есть и в ubuntu. Там надо прописать такие переменные.

Также надо скачать NDK с официального сайта распаковать его в домашний каталог и переименовать в NDK. Далее нужно скачать библиотеку SDL2 с сайта libsdl.org. Чтобы использовать sdl2 для android, важно не компилировать его для компьютера, потому что тогда это не скомпилируется для android. Чтобы проект скомпилировался, надо создать проект в android studio, любой, чтобы принять лицензию, иначе при сборке SDL2 будет просить лицензию.

Чтобы считывать файлы в android из assets, нужно использовать функции SDL_RWops. Вот пример использования в коде по работе со шрифтом. В этом случае мы не может использовать FT_New_Face, а вместо этого будем использовать FT_New_Memory_Face, чтобы использовать уже считанные данные.

Также я создал файл заголовок для подключения SDL2 заголовков. NO_SDL_GLEXT нужен, чтобы компиляция прошла успешно для Android.

Итак проект готов, шейдеры готовы для Opengl Es 3.0. Теперь надо создать android-project. Для этого распаковываем архив SDL2. Заходим в build-scripts. И выполняем так.

Появится такое сообщение.

Переходим в com.xverizex.test. Заходим в com.xverizex.test/app/jni/src. Копируем свой проект игры. И меняем файл Android.mk, в моём случае это выглядит так.

Как вы может уже заметили, я подключаю ещё библиотеку Freetype2. Я нашел уже готовую на github для android, но она не работала, нужно было кое что поменять. Также создаем каталог app/src/main/assets. В него помещаем наши ресурсы ( шрифты, спрайты, 3d модельки ).

Источник

Портирование любимой игры под Android

Создание игры процесс захватывающий и познавательный. Особенно это заметно, когда ремейк «классики» делаешь сам, руководствуясь идеями оригинала и десятками часов, потраченных на прохождение кампании. У меня не было сколь-нибудь значимого опыта разработки для Android’a, поэтому создание работающего «как надо» приложения для планшета поначалу выглядело довольно туманно, но от этого не менее притягательно. При наличии времени и возможностей, можно стряхнуть пыль со старых игр, подмазать и подклеить, добавив поддержку «больших» разрешений и окажется, что они выглядят не хуже современных продуктов, выложенных на маркете, даже с палитрой RGB565 без альфа-канала. Я предполагал, что будут подводные камни и заботливо спрятанные грабли, которые лежат тихонько во время разработки, но больно лупят по голове, стоит запустить игру на реальном железе. Чего сильно не хватало, так это отладчика, а возникающие проблемы лишь укрепили желание достичь поставленной цели. Под катом будет рассказ о том, как это все заработало.

Стоит сразу предупредить, что это возможно будет рассказ о велосипедах, я не придумал ничего такого, что не гуглится на просторах «интернетов». Также Читатель вряд ли увидит новые решения или мега технологии, но найдет опробованные инструкции по сборке приложения, использующего SDL1/2, для Android.

Здравствуйте!
Ремейк игры Caesar III© начинался совсем не как отдельный проект, а скорее набор фиксов для количества жителей, поддержки «больших» разрешений и исследования декомпилированного кода оригинальной игры в поисках пасхалок и недокументированных режимов работы. А когда количество восстановленного кода перевалило за половину от общего, стало понятно, что можно попытаться восстановить игру. В качестве библиотеки отрисовки была выбрана SDL1.2, которая хорошо зарекомендовала себя в других проектах, а ещё проста в освоении и использовании. Ремейк поначалу был Linux-only, в начале этого года перебрался на другие платформы (Mac, Windows и Haiku), а потом у меня завелся вот такой планшет, а голове периодически возникали мысли «работает на одном линуксе, должно работать и на другом».

Попытка номер раз, удачная
У SDL версии 1.2 «из коробки» нет возможности работы под андроидом, зато есть замечательный проект libsdl-android, который позволяет, используя свое окружение и скрипты собирать код, использующий эту библиотеку в приложении для андроида. Собранное приложение может загрузить ресурсы как из интернета, так и распаковать из установщика. Сам libsdl-android содержит большое количество библиотек, которые могут вам понадобиться, начиная от bzip2 и разных кодеков, до самой SDL и его окружения SDL_image, SDL_mixer, ttf и другие. Если у игры нет платформозависимого кода, то портирование занимает несколько шагов:

/;
echo «Downloading the sdk. »;
wget —quiet —continue dl.google.com/android/adt/adt-bundle-linux-$$ARCH-$$SDK_VERSION.zip;
echo «Extracting the sdk. »;
ARCHIVE=`readlink -f adt-bundle-linux-$$ARCH-$$SDK_VERSION.zip`;
cd

;
unzip -o -qq $$ARCHIVE;
echo «Configure paths. »;
echo «export ANDROID_SDK=

/.bashrc;
echo «export ANDROID_NDK=

/.bashrc;
echo «export NDK_ROOT=\$$ANDROID_NDK» >>

/.bashrc;
echo «export PATH=\$$PATH:\$$ANDROID_NDK:\$$ANDROID_SDK/tools:\$$ANDROID_SDK/platform-tools» >>

Если все удачно скомпилилось, то в папке commandergenius/project/bin появится файла MainActivity-[release|debug]-unsigned.apk, который нужно подписать и установить на устройство.

$ keytool -genkey -v -keystore rs.keystore -alias caesaria -keyalg RSA -keysize 2048 -validity 10000
$ jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore rs.keystore

/projects/commandergenius/project/bin/MainActivity-release-unsigned.apk caesaria
$ mv

/projects/caesaria.apk
$ adb uninstall net.dalerank.caesaria
$ adb install

Подводные камни
0. Определение окружения: для начала надо определиться в каком окружении будет работать Windows, Linux или Linux Android.
Решение: Проверяем наличие дефайнов ANDROID/__ANDROID__.

1. Логи: смотреть сообщения об ошибках и прочий вывод можно через abd logcat, но как оказалось стандартные средства типа stdout/printf не работают, можно конечно пользоваться выводом лога в файл и смотреть уже его, но хотелось какойто более привычной отладки.
Решение: подключаем заголовочный файл логов андроида #include , а для вывода сообщения пользуемся функцией
__android_log_print(ANDROID_LOG_DEBUG, CAESARIA_PLATFORM_NAME, «%s», str.c_str() );

с привычным printf синтаксисом.

2. Использование OpenGL: если кому понадобится OpenGL, то на мобильных плафтормах обитает его близкий родственник GLES.
Решение: подключаем вместо стандартных заголовояных файлов и , есть небольшие отличия в использовани текстур и отрисовке, но в основном код(простой код, который я использовал) работает практически без изменений.

3. Обработка событий: пропадает событие SDL_MOUSEBUTTONUP при движении пальцем по экрану, это могла быть недоработка в самой библиотеке libsdl-android или я где-то его терял. Проявлялось иногда в отсутствии реакции элементов интерфейса на действия пользоватся, например после движения остановились на кнопкой, которая по идее должна перейти в состояние если над ней находится курсор мыши.
Решение: Специфично для моего приложения — при сборке под андроид было добавлено принудительное обновление состояния элементов под курсором при движении последнего.

4. Мелкий интерфейс: разрешение экрана современных мобильных устройств сопоставимо или превышает разрешение монитора, используемого 10-15 лет назад, но физические размеры заметно меньше, оттого и сам элементы пользовательского интерфейса выглядят мелко и пользоваться ими будет не всегда удобно.
Решение: Переделка интерфейса, что достаточно хлопотное занятие и не всегда удается сохранить первоначальный вид.

Один переезд равен двум пожарам(народная мудрость)
Все началось с того, что один из коммитеров прислал ссылку на ветку разработки, где успешно запустил игру с использованием относительно свежей библиотеки SDL2, а до этого использовалась версия SDL1.2 — 2008 года выпуска. Надо сказать, что я и сам рассматривал возможность перехода на новую версию, особенно после просмотра списка изменений, который сулил нормальную поддержку Mac и Android, что называется «из коробки». А тут еще и миниотпуск на работе получился, взяв кувалду побольше гайд потолще и большую чашку кофе, я начал переводить ремейк на новый «движок».
Не хочу утомлять читателя техническими подбробностями переезда, просто у самой библиотеки с приходом аппаратной поддержки изменилась идеология работы, что поначалу доставляло определенные трудности, пока я к ней не привык. Переезд растянулся на неделю вечеров и под конец представлял собой исправление оставшихся недочетов и графических артефактов. Переделки были закончены и подготовлены сборки для «больших» ОС, и опять появилась необходимость повторного чтения мануалов по сборке приложения под Андроид, потому как libsdl-android нормально адаптирован для работы с SDL1.2, а поддержка SDL2 похоже заброшена (о чем сами авторы и пишут в ридми)

Осознал я правдивость этого текста, когда было потрачено несколько часов в попытке запустить порт в старой конфигурации через libsdl-android. Ну что ж, отрицательный опыт — тоже опыт: буду использовать доступные инструмены.

Попытка номер два, не совсем удачная
SDL2 уже содержит все необходимые конфиги для сборки приложения под андроид, почитав статью, рекомендованную на официальном сайте, можно пробовать собрать чтонибудь. Опять же будут несколько шагов, за исключением установки и настройки adt.

$git clone bitbucket.org/dalerank/caesaria
$hg clone hg.libsdl.org/SDL
$mkdir caesaria/android
$cp SDL/android-project caesaria/android
$mkdir caesaria/android/libs
$mkdir caesaria/android/data
$cp SDL caesaria/android/libs

Для чего все эти копирования сделаны. чтобы проще было считать относительные пути для библиотек. В папке android/libs будет лежать SDL и компания, в папке android/data — будет иконка приложения.

В папке android/android-project/jni создаем символьные ссылки на компоненты приложения

$ln -s ../../libs/SDL SDL
$ln -s ../../libs/SDL_mixer SDL_mixer
$ln -s ../../libs/SDL_net SDL_net
$ln -s ../../src/dep/aes aes
$ln -s ../../src/source application
$ln -s ../../src/dep/bzip2 bzip2
$ln -s ../../src/dep/freetype freetype
$ln -s ../../src/dep/libpng libpng
$ln -s ../../src/dep/lzma lzma
$ln -s ../../src/dep/smk smk
$ln -s ../../src/dep/src src
$ln -s ../../src/dep/ttf ttf
$ln -s ../../src/dep/zlib zlib

Немного о том, что же я тут написал:
zlib нужен для сборки freetype, который в свою очередь нужен для SDL_ttf и будет отвечать за рендеринг шрифтов.
Библиотека smk нужна для воспроизведения видео в формате smack, в этом формате выполнены ролики оригинальной игры.
Bzip, lzma и aes нужны для работы с zip-архивами.
libpng требуется для загрузки текстур для игры.
SDL, SDL_mixer, SDL_net отвечают соответсвенно за рисования, работы со звуком и сетью.
application содержит исходники самой игры, которые будут собраны в библиотеку libapplication.so
в папке src располагаются исходники библиотеки libmain.so, а вот для неё уже написано кружево java-вызовов над с-кодом, которое позволит нам успешно стартовать и порадовать пользователя яркой картинкой.
Настройки проекта и конфиги для ndk уже любезно предоставлены авторами SDL2

Чтобы система сборки увидела, какие нам необходимы библиотеки для работы и собрала их, нужно написать для них конфиги, наподобие Makеfile. С большой вероятностью Android.mk уже будет присутствовать в репозитории библиотеки, или их можно найти на просторах интернета. Мне пришлось дописать конфиги сборки для для игры и библиотеки libsmk.

Android.mk для libsmk очень прост и будет понятен людям, не связанным с программированием для андроида
#smk/Android.mk
LOCAL_PATH := $(call my-dir)

LOCAL_MODULE := smk
LOCAL_SRC_FILES := $(subst $(LOCAL_PATH)/,, \
$(wildcard $(LOCAL_PATH)/*.c))

Конфиг содержит указание скомпилировать все файлы с расширением .с, найденные в текущей папке (для libsmk это будет jni/smk)

Аналогично пишется и конфиг для сборки библиотеки, которая будет представлять саму игру.

#application/Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

SDL_PATH := ../../libs/SDL
SDL_MIXER_PATH := ../../libs/SDL_mixer
SDL_NET_PATH := ../../libs/SDL_net
GAME_PATH := $(LOCAL_PATH)
DEP_PATH := ../dep

LOCAL_C_INCLUDES := \
$(LOCAL_PATH)/$(SDL_PATH)/include \
$(LOCAL_PATH)/$(SDL_MIXER_PATH) \
$(LOCAL_PATH)/$(SDL_NET_PATH)/include \
$(LOCAL_PATH)/$(FREETYPE_PATH)/include \
$(LOCAL_PATH)/$(GAME_PATH) \
$(LOCAL_PATH)/$(DEP_PATH) \
$(LOCAL_PATH)/$(DEP_PATH)/libpng

# Add your application source files here…
LOCAL_SRC_FILES := $(subst $(LOCAL_PATH)/,, \
$(wildcard $(GAME_PATH)/*.cpp) \
$(wildcard $(GAME_PATH)/core/*.cpp) \
$(wildcard $(GAME_PATH)/vfs/*.cpp) \
$(wildcard $(GAME_PATH)/objects/*.cpp) \
$(wildcard $(GAME_PATH)/gui/*.cpp) \
$(wildcard $(GAME_PATH)/city/*.cpp) \
$(wildcard $(GAME_PATH)/gfx/*.cpp) \
$(wildcard $(GAME_PATH)/events/*.cpp) \
$(wildcard $(GAME_PATH)/world/*.cpp) \
$(wildcard $(GAME_PATH)/pathway/*.cpp) \
$(wildcard $(GAME_PATH)/walker/*.cpp) \
$(wildcard $(GAME_PATH)/good/*.cpp) \
$(wildcard $(GAME_PATH)/religion/*.cpp) \
$(wildcard $(GAME_PATH)/scene/*.cpp) \
$(wildcard $(GAME_PATH)/sound/*.cpp) \
$(wildcard $(GAME_PATH)/game/*.cpp))

LOCAL_SHARED_LIBRARIES := SDL2 SDL2_mixer SDL2_net sdl_ttf pnggo lzma bzip2 aes smk
LOCAL_CPP_FEATURES += exceptions
LOCAL_CPP_FEATURES += rtti
LOCAL_LDLIBS := -lGLESv1_CM -llog

Тоже должно быть понятно, в LOCAL_C_INCLUDES добавляет пути где нужно искать заголовочные файлы, в LOCAL_SRC_FILES добавляем файлы с исходным кодом,
в LOCAL_SHARED_LIBRARIES прописываем зависимости приложения.

флаги rtti, exceptions отвечают за использование RTTI и исключений.

Теоретически, после выполнения описанных шагов на подключенном девайсе или эмуляторе вы увидите установленное приложение.

Грабли
1. Где искать ресурсы.
Место размещения ресурсов зависит от конкретной реализации ОС, но в большинстве случаев приложению будет доступна папка /sdcard/Android/data/имя_пакета/files, при использовании непосредственно пути может быть ошибка доступа или ошибка поиска файла.
Получить полный путь к директории приложения можно через функцию SDL_AndroidGetExternalStoragePath(), определенную в файле SDL_system.h
2. Использование флагов создания окна.
Комбинация SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN | SDL_WINDOW_BORDERLESS работает не на всех девайсах, убираем SDL_WINDOW_OPENGL или SDL_WINDOW_BORDERLESS и смотрим какой из флагов крашит программу. Не могу объяснить с чем связано такое поведение. С флагом SDL_WINDOW_SHOWN запукается по логам один в один, как и со всеми флагами, но при этом вероятность вылета намного меньше.
3. Слишком много звуковых каналов.
Наблюдаются вылеты при вызове функции SDL_mixer::Mix_AllocateChannels(N>16) c ошибкой, что невозможно иниализировать звук. Обходится снижением запрошенного числа каналов, насколько корректно решать эту проблему таким способом я не знаю.
4. stlport vs gnustl
Вылет при использовании stlport, нарвался на этот баг при обходе вектора с использованием итераторов на эмуляторе Nexus 7 (Android 4.0.3). Опять же не могу объяснить факт сей ошибки, решилось использованием gnustl при сборке приложения.
5. Мое кунгфу сильнее твоего.
Использование библиотеки с именем, похожим на имя той, что уже есть в системе приводит к загрузке чужой библиотеки, в которой возможно нет необходимых функций. Ошибка появилась из-за того, что я собираю свою версию libpng.so, решение было найдено на stackoverflow, исправилось заменой имени библиотеки libpng.so на libpnggo.so

В заключении.
Работает! Почти не отличается от ББ! Доволен ли я? Не очень!

Дело в том, что толи я криворукий, толи лыжи не едут, но на планшете приложение получилось крайне медленным (10-12 fps для крайне простой картинки результат унылый), думаю, вина тут в руках и незнании матчасти. SDL — отличная библиотека в обеих реинкарнациях, и много действительно хороших игр использует её, а также портировано на андроид.

Потраченного времени на создание порта не жаль точно, получен определенный опыт и много положительных эмоций, когда игра взлетела. Тем, кто ещё раздумывает пробовать или нет, однозначно пробовать, не откладывайте на потом!

З.Ы. За развитием проекта всегда можно посмотреть тут.

Источник

Читайте также:  Экран блокировки андроид сам включается
Оцените статью