Будучи в первую очередь разработчиком c / c ++, я всегда думал, что единственным вариантом для разработки мобильных игр для меня было использование iOS, которое позволяет использовать c / c ++ (и минимизировать цель C).
Я слышал от друга, что у android есть встроенный инструментарий разработки, который позволяет коду c ++ работать на android.
Кто-нибудь использовал это, и если так, как вы это нашли? Я имею в виду, будет ли он «просто работать», как iOS, или есть другие соображения, о которых нужно позаботиться, из-за широкого спектра доступных устройств для Android?
Android API являются Java. С 2010 года Google предоставляет NDK (SDK) для разработчиков C / C ++.
НДК предлагает два способа:
для устройств Android 1.5 вы можете загрузить библиотеку elf и использовать ее из java-приложения через мост JNI
для устройств Android 2.3 вы можете использовать NativeActivity для обхода кода активности Java для полноэкранного приложения.
NDK предлагает немного API C / C ++:
псевдо-libc под названием bionics: многие функции недоступны
библиотека pthread
OpenGL ES 1.x (> Android 1.5) и OpenGL ES 2.x (Android 2.0)
OpenSL (ограниченная поддержка на Android 2.3)
Но многие API работают только на Java (также доступны через JNI).
Версия NDK 5 является первой для разработчиков на C ++, потому что она предлагает:
RTTI
Поддержка исключений
STLport
Поддержка GDB для многопоточных программ
Самая болезненная операция - отладка на устройствах Android. Поэтому я разрабатываю собственную многоплатформенную инфраструктуру (OS X, Windows, Linux, iOS и Android) для отладки сначала на платформе настольных компьютеров, затем на платформе iOS (на симуляторе) и Last (на Android).
Эмулятор Android (не симулятор) имеет низкую производительность и не может эмулировать OpenGL ES 2.x. Я рекомендую реальные устройства для разработки.
Я успешно использовал Android NDK для переноса двух игр SDL + OpenGL на Android и обнаружил, что это удивительно легко. У меня есть Java-оболочка на 200 строк, которая создает контекст GL и предоставляет служебные классы, такие как ввод, звук и загрузка изображений для кода C ++ для обратного вызова. Образец программы "San-Angeles" в NDK является отличной отправной точкой.
Кстати, можно создавать программы на C / C ++ без использования Java, но я считаю удобным получать доступ к некоторым методам уровня ОС, периодически вызывая JVM.
Я думаю, что если ваша игра уже скомпилирована на Linux, вы будете чувствовать себя как дома. Из 100+ файлов в моем текущем проекте только 4 имеют #ifdef ANDROID_NDKдирективу (классы, связанные с изображением и звуком).
Фактически большая часть времени, потраченного на портирование игры, была связана с известной ошибкой эмулятора, о которой я не знал.
Ранее в прошлом у меня были (расстраивающие) проблемы с попыткой получить простой конвейер компиляции / сборки / развертывания моей игры opengl на эмуляторе Android. Можете ли вы указать мне ресурс или что-то, что я могу использовать? (Я не знаю, есть ли у вас эти служебные классы с открытым исходным кодом, но если вы это сделаете, мне будет интересно увидеть их.) Спасибо
brainydexter
1
@brainydexter: Я парень из командной строки, которому нравятся автоинструменты, поэтому я не уверен, что буду вам очень полезен, но мой конвейер выглядит следующим образом: убедитесь ANDROID_NDK_ROOT, что он установлен $PATH(вместе с [sdk_location]/toolsи [sdl_location]/platform-tools); перейти в каталог проекта; скомпилировать код NDK с помощью ndk-build; скомпилировать код Java и собрать пакет с помощью ant compile; загрузить в эмулятор или подключенное устройство с помощью ant install. Что же касается OpenSourcing движка, я еще не решил, но я уже публикую код в блоге
Сэм Hocevar
Спасибо за ссылку! Я буду следить за вашим блогом.
Brainydexter
4
Android поддерживает нативные приложения начиная с версии 1.5 через Android NDK , что должно очень хорошо охватывать вашу целевую аудиторию. Вам все еще нужно простое Android-приложение для Android, которое загружает исходную сторону вашего приложения через JNI и передает, например, вызовы ввода и рендеринга.
Было несколько версий NDK, но вы можете использовать последнюю версию NDK и выбрать целевой API, который вы хотите поддерживать. Начиная с версии 2.3 Android, вы можете делать намного больше на нативной стороне, и вам нужно меньше Java-кода, но поддержка 2.3 для устройств в настоящее время очень ограничена.
Нативная разработка на Android C / C ++ является рабочим решением, по крайней мере, для полноэкранных игр, и усилия, необходимые для переноса существующих приложений C / C ++ OpenGL ES, довольно малы.
Я успешно использовал Android NDK для переноса двух игр SDL + OpenGL на Android и обнаружил, что это удивительно легко. У меня есть Java-оболочка на 200 строк, которая создает контекст GL и предоставляет служебные классы, такие как ввод, звук и загрузка изображений для кода C ++ для обратного вызова. Образец программы "San-Angeles" в NDK является отличной отправной точкой.
Кстати, можно создавать программы на C / C ++ без использования Java, но я считаю удобным получать доступ к некоторым методам уровня ОС, периодически вызывая JVM.
Я думаю, что если ваша игра уже скомпилирована на Linux, вы будете чувствовать себя как дома. Из 100+ файлов в моем текущем проекте только 4 имеют
#ifdef ANDROID_NDK
директиву (классы, связанные с изображением и звуком).Фактически большая часть времени, потраченного на портирование игры, была связана с известной ошибкой эмулятора, о которой я не знал.
источник
ANDROID_NDK_ROOT
, что он установлен$PATH
(вместе с[sdk_location]/tools
и[sdl_location]/platform-tools
); перейти в каталог проекта; скомпилировать код NDK с помощьюndk-build
; скомпилировать код Java и собрать пакет с помощьюant compile
; загрузить в эмулятор или подключенное устройство с помощьюant install
. Что же касается OpenSourcing движка, я еще не решил, но я уже публикую код в блогеAndroid поддерживает нативные приложения начиная с версии 1.5 через Android NDK , что должно очень хорошо охватывать вашу целевую аудиторию. Вам все еще нужно простое Android-приложение для Android, которое загружает исходную сторону вашего приложения через JNI и передает, например, вызовы ввода и рендеринга.
Было несколько версий NDK, но вы можете использовать последнюю версию NDK и выбрать целевой API, который вы хотите поддерживать. Начиная с версии 2.3 Android, вы можете делать намного больше на нативной стороне, и вам нужно меньше Java-кода, но поддержка 2.3 для устройств в настоящее время очень ограничена.
Нативная разработка на Android C / C ++ является рабочим решением, по крайней мере, для полноэкранных игр, и усилия, необходимые для переноса существующих приложений C / C ++ OpenGL ES, довольно малы.
источник