Siendo un desarrollador principalmente de c / c ++, siempre he pensado que la única opción para el desarrollo de juegos móviles para mí era usar iOS, que permite c / c ++ (y minimizar el objetivo C).
Sin embargo, un amigo me dijo que Android tiene un kit de herramientas de desarrollo nativo que permite que el código c ++ funcione en Android.
¿Alguien ha usado esto, y si es así, cómo lo encuentra? Quiero decir, ¿"solo funcionará" como iOS, o hay más consideraciones que deben ser atendidas debido a la gran variedad de dispositivos Android disponibles?
Las API de Android son Java. Desde 2010, Google proporciona el NDK (un SDK) para desarrolladores de C / C ++.
El NDK ofrece dos formas:
para dispositivos Android 1.5, puede cargar una biblioteca elf y usarla desde la aplicación java a través de un puente JNI
para dispositivos Android 2.3, puede usar NativeActivity para omitir el código de actividad de Java para la aplicación de pantalla completa.
El NDK ofrece pocas API C / C ++:
un pseudo libc llamado bionics: muchas funciones no están disponibles
una biblioteca pthread
OpenGL ES 1.x (> Android 1.5) y OpenGL ES 2.x (Android 2.0)
OpenSL (soporte limitado en Android 2.3)
Pero muchas API son solo Java (también disponible a través de JNI).
La versión NDK 5 es la primera que pueden usar los desarrolladores de C ++ porque ofrece:
RTTI
Excepciones apoya
STLport
Soporte de gdb para programas multiproceso
La operación más dolorosa es la depuración en dispositivos Android. Así que desarrollo mi propio marco multiplataforma (OS X, Windows, Linux, iOS y Android) para depurar primero en la plataforma de escritorio, luego en la plataforma iOS (en el simulador) y por último (Android).
El emulador de Android (no un simulador) tiene un bajo rendimiento y no puede emular OpenGL ES 2.x. Recomiendo dispositivos reales para desarrollar.
He utilizado con éxito el Android NDK para portar dos juegos SDL + OpenGL a Android y lo encontré sorprendentemente fácil. Tengo un contenedor Java de 200 líneas que crea el contexto GL y proporciona clases de utilidad como entrada, sonido y carga de imágenes para que el código C ++ vuelva a llamar. El programa de muestra "San-Angeles" en el NDK es un excelente punto de partida.
Por cierto, es posible construir programas C / C ++ sin una línea de Java, pero me parece conveniente acceder a algunos métodos a nivel de sistema operativo llamando de vez en cuando a la JVM.
Creo que si tu juego ya se compila en Linux, te sentirás como en casa. De más de 100 archivos en mi proyecto actual, solo 4 tienen una #ifdef ANDROID_NDKdirectiva (las clases relacionadas con la imagen y el sonido).
De hecho, la mayor parte del tiempo dedicado a portar el juego se debió a un error conocido del emulador del que no estaba al tanto.
Anteriormente en el pasado, tuve problemas (frustrantes) al tratar de obtener la tubería simple de compilar / construir / implementar mi juego opengl en el emulador de Android. ¿Me puede indicar un recurso o algo que pueda usar? (No sé si tiene esas clases de utilidad de código abierto, pero si las tiene, estaré interesado en verlas.) Gracias
brainydexter
1
@brainydexter: Soy un tipo de línea de comandos que disfruta de las herramientas automáticas, así que no estoy seguro de que te sea de gran ayuda, pero mi canalización es la siguiente: asegúrese de que ANDROID_NDK_ROOTesté configurado, que esté en $PATH(junto con [sdk_location]/toolsy [sdl_location]/platform-tools); ir al directorio del proyecto; compilar el código NDK usando ndk-build; compila el código Java y construye el paquete usando ant compile; subir al emulador o dispositivo conectado usando ant install. En cuanto a OpenSourcing el motor, no he decidido todavía, pero ya estoy publicando código en el blog de
Sam Hocevar
Gracias por el enlace! Estaré atento a tu blog.
brainydexter
4
Android ha admitido aplicaciones nativas desde la versión 1.5 a través de Android NDK , que deberían cubrir muy bien a su público objetivo. Todavía necesita una aplicación simple de Android Java que cargue el lado nativo de su aplicación a través de JNI y pase hacia adelante, por ejemplo, llamadas de entrada y render.
Ha habido varias versiones del NDK, pero puede usar el último NDK y seleccionar la API de destino que desea admitir. Desde la versión 2.3 de Android, puede hacer mucho más en el lado nativo y necesita menos código Java, pero el soporte del dispositivo para 2.3 actualmente es muy limitado.
El desarrollo nativo de Android C / C ++ es una solución que funciona al menos para juegos de pantalla completa y el esfuerzo necesario para portar aplicaciones existentes de C / C ++ OpenGL ES es bastante pequeño.
He utilizado con éxito el Android NDK para portar dos juegos SDL + OpenGL a Android y lo encontré sorprendentemente fácil. Tengo un contenedor Java de 200 líneas que crea el contexto GL y proporciona clases de utilidad como entrada, sonido y carga de imágenes para que el código C ++ vuelva a llamar. El programa de muestra "San-Angeles" en el NDK es un excelente punto de partida.
Por cierto, es posible construir programas C / C ++ sin una línea de Java, pero me parece conveniente acceder a algunos métodos a nivel de sistema operativo llamando de vez en cuando a la JVM.
Creo que si tu juego ya se compila en Linux, te sentirás como en casa. De más de 100 archivos en mi proyecto actual, solo 4 tienen una
#ifdef ANDROID_NDK
directiva (las clases relacionadas con la imagen y el sonido).De hecho, la mayor parte del tiempo dedicado a portar el juego se debió a un error conocido del emulador del que no estaba al tanto.
fuente
ANDROID_NDK_ROOT
esté configurado, que esté en$PATH
(junto con[sdk_location]/tools
y[sdl_location]/platform-tools
); ir al directorio del proyecto; compilar el código NDK usandondk-build
; compila el código Java y construye el paquete usandoant compile
; subir al emulador o dispositivo conectado usandoant install
. En cuanto a OpenSourcing el motor, no he decidido todavía, pero ya estoy publicando código en el blog deAndroid ha admitido aplicaciones nativas desde la versión 1.5 a través de Android NDK , que deberían cubrir muy bien a su público objetivo. Todavía necesita una aplicación simple de Android Java que cargue el lado nativo de su aplicación a través de JNI y pase hacia adelante, por ejemplo, llamadas de entrada y render.
Ha habido varias versiones del NDK, pero puede usar el último NDK y seleccionar la API de destino que desea admitir. Desde la versión 2.3 de Android, puede hacer mucho más en el lado nativo y necesita menos código Java, pero el soporte del dispositivo para 2.3 actualmente es muy limitado.
El desarrollo nativo de Android C / C ++ es una solución que funciona al menos para juegos de pantalla completa y el esfuerzo necesario para portar aplicaciones existentes de C / C ++ OpenGL ES es bastante pequeño.
fuente