Tworzenie gier na Androida w c ++

26

Będąc przede wszystkim programistą c / c ++, zawsze myślałem, że jedyną opcją dla rozwoju gier mobilnych jest dla mnie użycie iOS, który pozwala na c / c ++ (i minimalizację celu C).

Słyszałem od znajomego, że Android ma natywny zestaw narzędzi programistycznych, który pozwala na działanie kodu c ++ na Androidzie.

Czy ktoś tego użył, a jeśli tak, to jak go znaleźć? Chodzi mi o to, czy będzie to „działało” podobnie jak iOS, czy też należy wziąć pod uwagę inne kwestie związane z szeroką gamą dostępnych urządzeń z Androidem?

kamziro
źródło

Odpowiedzi:

26

Interfejsy API Androida to Java. Od 2010 roku Google udostępnia NDK (SDK) dla programistów C / C ++.

NDK oferuje dwa sposoby:

  • w przypadku urządzeń z Androidem 1.5 można załadować bibliotekę elfów i korzystać z niej z aplikacji Java za pośrednictwem mostu JNI
  • dla urządzeń z Androidem 2.3 możesz użyć NativeActivity, aby ominąć kod aktywności Java dla aplikacji pełnoekranowej.

NDK oferuje kilka API C / C ++:

  • pseudo libc o nazwie bionika: wiele funkcji nie jest dostępnych
  • biblioteka pthread
  • OpenGL ES 1.x (> Android 1.5) i OpenGL ES 2.x (Android 2.0)
  • OpenSL (ograniczona obsługa Androida 2.3)

Ale wiele API jest tylko Java (dostępne również przez JNI).

Wersja NDK 5 jest pierwszą aplikacją dla programistów C ++, ponieważ oferuje:

  • RTTI
  • Obsługiwane są wyjątki
  • STLport
  • obsługa gdb dla programów wielowątkowych

Najbardziej bolesną operacją jest debugowanie na urządzeniach z Androidem. Opracowuję więc własną platformę wieloplatformową (OS X, Windows, Linux, iOS i Android), aby debugować najpierw na platformie stacjonarnej, następnie na platformie iOS (na Symulatorze) i Last (Android).

Emulator Androida (nie symulator) ma słabą wydajność i nie może emulować OpenGL ES 2.x. Polecam opracowanie prawdziwych urządzeń.

Znajdziesz wiele przydatnych informacji:

Ellis
źródło
Link „kod wejściowy” jest teraz zepsuty.
Josh1billion
1
naprawiono: zmień Ellismarkov na IOPixel
Ellis
9

Z powodzeniem wykorzystałem Android NDK do przeniesienia dwóch gier SDL + OpenGL na Androida i było to zaskakująco łatwe. Mam 200-liniowe opakowanie Java, które tworzy kontekst GL i zapewnia klasy narzędzi, takie jak ładowanie danych wejściowych, dźwięku i obrazu dla kodu C ++ w celu oddzwonienia. Przykładowy program „San-Angeles” w NDK jest doskonałym punktem wyjścia.

Nawiasem mówiąc, możliwe jest budowanie programów C / C ++ bez linii Java, ale uważam, że wygodnie jest uzyskać dostęp do niektórych metod na poziomie systemu operacyjnego, od czasu do czasu wywołując JVM.

Myślę, że jeśli twoja gra jest już kompilowana na Linuksie, poczujesz się jak w domu. Z ponad 100 plików w moim bieżącym projekcie tylko 4 mają #ifdef ANDROID_NDKdyrektywę (klasy związane z obrazem i dźwiękiem).

W rzeczywistości większość czasu poświęcanego na przenoszenie gry było spowodowane znanym błędem emulatora, o którym nie wiedziałem.

sam hocevar
źródło
Wcześniej miałem (frustrujące) problemy z uzyskaniem prostego potoku kompilacji / kompilacji / wdrożenia mojej gry opengl na emulatorze Androida. Czy możesz wskazać mi zasób lub coś, z czego mogę skorzystać? (Nie wiem, czy masz te klasy narzędzi open source, ale jeśli tak, będę zainteresowany ich zobaczeniem.) Dzięki
brainydexter
1
@brainydexter: Jestem facetem z linii poleceń, który lubi autotools, więc nie jestem pewien, czy będę ci bardzo pomocny, ale mój rurociąg jest następujący: upewnij ANDROID_NDK_ROOTsię, że jest ustawiony, że jest w $PATH(wraz z [sdk_location]/toolsi [sdl_location]/platform-tools); przejdź do katalogu projektu; skompiluj kod NDK za pomocą ndk-build; skompiluj kod Java i skompiluj pakiet używając ant compile; przesłać do emulatora lub podłączonego urządzenia za pomocą ant install. Jeśli chodzi o opensourcing silnika, jeszcze nie zdecydowałem, ale już publikuję kod na blogu
sam hocevar
Dzięki za link! Będę pilnować twojego bloga.
brainydexter
4

Android obsługuje natywne aplikacje od wersji 1.5 za pośrednictwem Androida NDK , co powinno bardzo dobrze obejmować twoją grupę docelową. Nadal potrzebujesz prostej aplikacji Java na Androida, która ładuje natywną stronę aplikacji przez JNI i przekazuje dalej, np. Wprowadzanie i renderowanie połączeń.

Istnieje kilka wersji NDK, ale możesz użyć najnowszego NDK i wybrać docelowy interfejs API, który chcesz obsługiwać. Od wersji Androida 2.3 możesz zrobić znacznie więcej po stronie natywnej i potrzebujesz mniej kodu Java, ale obsługa urządzeń w wersji 2.3 jest obecnie bardzo ograniczona.

Natywne tworzenie Androida C / C ++ jest działającym rozwiązaniem przynajmniej dla gier pełnoekranowych, a wysiłek wymagany do przeniesienia istniejących aplikacji C / C ++ OpenGL ES jest dość niewielki.

sprzedać
źródło