Sendo um desenvolvedor principalmente de c / c ++, sempre achei que a única opção para o desenvolvimento de jogos para celular era usar o iOS, que permite c / c ++ (e minimização do objetivo C).
Ouvi de um amigo, porém, que o Android tem um kit de ferramentas de desenvolvimento nativo que permite que o código C ++ funcione no Android.
Alguém já usou isso e, em caso afirmativo, como o encontra? Quero dizer, "funcionará" como o iOS ou há mais considerações que precisam ser atendidas devido à grande variedade de dispositivos Android disponíveis?
APIs do Android são Java. Desde 2010, o Google fornece o NDK (um SDK) para desenvolvedores de C / C ++.
O NDK oferece duas maneiras:
para dispositivos Android 1.5, você pode carregar uma biblioteca elf e usá-la no aplicativo java por meio de uma ponte JNI
para dispositivos Android 2.3, você pode usar um NativeActivity para ignorar o código de atividade Java do aplicativo de tela cheia.
O NDK oferece poucas API C / C ++:
uma pseudo libc chamada biônica: muitas funções não estão disponíveis
uma biblioteca pthread
OpenGL ES 1.x (> Android 1.5) e OpenGL ES 2.x (Android 2.0)
OpenSL (suporte limitado no Android 2.3)
Mas muitas APIs são apenas Java (também disponíveis via JNI).
A versão NDK 5 é a primeira utilizável para desenvolvedores de C ++ porque oferece:
RTTI
Exceções suportadas
STLport
suporte a gdb para programas multiencadeados
A operação mais dolorosa é a depuração em dispositivos Android. Então, desenvolvo minha própria estrutura multiplataforma (OS X, Windows, Linux, iOS e Android) para depurar primeiro na plataforma desktop, na próxima plataforma iOS (no Simulator) e Last (Android).
O emulador do Android (não um simulador) tem um desempenho ruim e não pode emular o OpenGL ES 2.x. Eu recomendo dispositivos reais para desenvolver.
Usei com êxito o NDK do Android para portar dois jogos SDL + OpenGL para o Android e achei surpreendentemente fácil. Eu tenho um wrapper Java de 200 linhas que cria o contexto GL e fornece classes de utilidade, como carregamento de entrada, som e imagem para o código C ++ retornar. O programa de amostra "San-Angeles" no NDK é um excelente ponto de partida.
A propósito, é possível criar programas C / C ++ sem uma linha de Java, mas acho conveniente acessar alguns métodos no nível do SO chamando a JVM de tempos em tempos.
Eu acho que se o seu jogo já compilar no Linux, você se sentirá em casa. Dos mais de 100 arquivos no meu projeto atual, apenas 4 têm uma #ifdef ANDROID_NDKdiretiva (as classes relacionadas à imagem e ao som).
Na verdade, a maior parte do tempo gasto portando o jogo era por causa de um bug emulador conhecido que eu não conhecia.
Anteriormente, tive problemas (frustrantes) tentando obter o pipeline simples de compilar / construir / implantar meu jogo opengl no emulador Android. Você pode me indicar um recurso ou algo que eu possa usar? (Eu não sei se você tem essas classes de utilitários de código aberto, mas se o fizer, eu vou estar interessado em vê-los.) Graças
brainydexter
11
@brainydexter: Eu sou um cara da linha de comando que gosta das ferramentas automáticas, então não tenho certeza de ser muito útil para você, mas meu pipeline é o seguinte: garantir que ANDROID_NDK_ROOTestá definido, que está dentro $PATH(junto com [sdk_location]/toolse [sdl_location]/platform-tools); vá para o diretório do projeto; compile o código NDK usando ndk-build; compile o código Java e construa o pacote usando ant compile; faça o upload para o emulador ou dispositivo conectado usando ant install. Quanto opensourcing o motor, eu não decidi ainda, mas eu já estou publicando código no blogue
Sam Hocevar
Obrigado pelo link! Vou ficar de olho no seu blog.
brainydexter
4
O Android oferece suporte a aplicativos nativos desde a versão 1.5 ao Android NDK , que deve cobrir muito bem seu público-alvo. Você ainda precisa de um aplicativo Java Android simples que carregue o lado nativo do seu aplicativo através do JNI e passe adiante, por exemplo, chamadas de entrada e renderização.
Houve várias versões do NDK, mas você pode usar o NDK mais recente e selecionar a API de destino que deseja oferecer suporte. Desde a versão 2.3 do Android, você pode fazer muito mais no lado nativo e precisa de menos código Java, mas o suporte ao dispositivo para 2.3 é atualmente muito limitado.
O desenvolvimento nativo do Android C / C ++ é uma solução funcional, pelo menos para jogos em tela cheia, e o esforço necessário para portar aplicativos OpenGL ES existentes no C / C ++ é bastante pequeno.
Usei com êxito o NDK do Android para portar dois jogos SDL + OpenGL para o Android e achei surpreendentemente fácil. Eu tenho um wrapper Java de 200 linhas que cria o contexto GL e fornece classes de utilidade, como carregamento de entrada, som e imagem para o código C ++ retornar. O programa de amostra "San-Angeles" no NDK é um excelente ponto de partida.
A propósito, é possível criar programas C / C ++ sem uma linha de Java, mas acho conveniente acessar alguns métodos no nível do SO chamando a JVM de tempos em tempos.
Eu acho que se o seu jogo já compilar no Linux, você se sentirá em casa. Dos mais de 100 arquivos no meu projeto atual, apenas 4 têm uma
#ifdef ANDROID_NDK
diretiva (as classes relacionadas à imagem e ao som).Na verdade, a maior parte do tempo gasto portando o jogo era por causa de um bug emulador conhecido que eu não conhecia.
fonte
ANDROID_NDK_ROOT
está definido, que está dentro$PATH
(junto com[sdk_location]/tools
e[sdl_location]/platform-tools
); vá para o diretório do projeto; compile o código NDK usandondk-build
; compile o código Java e construa o pacote usandoant compile
; faça o upload para o emulador ou dispositivo conectado usandoant install
. Quanto opensourcing o motor, eu não decidi ainda, mas eu já estou publicando código no blogueO Android oferece suporte a aplicativos nativos desde a versão 1.5 ao Android NDK , que deve cobrir muito bem seu público-alvo. Você ainda precisa de um aplicativo Java Android simples que carregue o lado nativo do seu aplicativo através do JNI e passe adiante, por exemplo, chamadas de entrada e renderização.
Houve várias versões do NDK, mas você pode usar o NDK mais recente e selecionar a API de destino que deseja oferecer suporte. Desde a versão 2.3 do Android, você pode fazer muito mais no lado nativo e precisa de menos código Java, mas o suporte ao dispositivo para 2.3 é atualmente muito limitado.
O desenvolvimento nativo do Android C / C ++ é uma solução funcional, pelo menos para jogos em tela cheia, e o esforço necessário para portar aplicativos OpenGL ES existentes no C / C ++ é bastante pequeno.
fonte