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?
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ń.
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.
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.
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_NDK
dyrektywę (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.
źródło
ANDROID_NDK_ROOT
się, że jest ustawiony, że jest w$PATH
(wraz z[sdk_location]/tools
i[sdl_location]/platform-tools
); przejdź do katalogu projektu; skompiluj kod NDK za pomocąndk-build
; skompiluj kod Java i skompiluj pakiet używającant 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 bloguAndroid 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.
źródło