Разработка игр для Android на С ++

26

Будучи в первую очередь разработчиком c / c ++, я всегда думал, что единственным вариантом для разработки мобильных игр для меня было использование iOS, которое позволяет использовать c / c ++ (и минимизировать цель C).

Я слышал от друга, что у android есть встроенный инструментарий разработки, который позволяет коду c ++ работать на android.

Кто-нибудь использовал это, и если так, как вы это нашли? Я имею в виду, будет ли он «просто работать», как iOS, или есть другие соображения, о которых нужно позаботиться, из-за широкого спектра доступных устройств для Android?

kamziro
источник

Ответы:

26

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. Я рекомендую реальные устройства для разработки.

Вы можете найти много полезной информации:

Эллис
источник
ссылка "входной код" теперь не работает.
Josh1billion
1
исправлено: изменение Эллисмаркова на IOPixel
Эллис
9

Я успешно использовал 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, довольно малы.

msell
источник