2016-03-10 13 views
8

Używam LibGDX do pisania aplikacji na Androida i iOS i chcę mieć możliwość dodawania kodu C++ do moich aplikacji w celu zoptymalizowania niektórych części i przeniesienia niektórych funkcji itp.Jak utworzyć udostępnioną bibliotekę w C++ dla Androida i iOS?

Szukałem w Internecie i próbowałem śledzić niektóre tutoriale, ale nie znalazłem tego, czego potrzebuję.

Jak napisać bardzo prostą bibliotekę C++, którą mogę załadować w LibGDX? Z jakich narzędzi muszę skorzystać? Visual Studio? Pracuję w Android Studio.

Myślę, że potrzebuję pliku .so dla Androida i pliku .a na iOS, czy to prawda?

Odpowiedz

5

Na obu platformach możliwe jest zawarcie zarówno wstępnie skompilowanej biblioteki, jak i kodu źródłowego C++.

Na urządzeniach z Androidem warto sprawdzić, czy używasz Android NDK. Pozwala to na dołączenie natywnego kodu C/C++, który może przejść do Javy. Połączenie między Javą i C/C++ jest zarządzane za pomocą JNI. Jest to dość żmudny, niezręczny system do komunikacji między C++ i Javą. Będziesz chciał zajrzeć do konfigurowania pliku Makefile Android.mk, który określa, w jaki sposób dołączyć bibliotekę (lub kod źródłowy) do swojej kompilacji.

Na iOS jest trochę bardziej ściśle powiązany. Możesz mieć pliki Objective-C++, które mogą działać zarówno w C++, jak i Objective-C. Jeśli używasz Swift, jest trochę inny (pomost między Objective-C++ i Swift).

W niektórych przypadkach, gdy platforma (Android/iOS) zapewnia funkcjonalność wyższą od realnej lub realistycznej w C++, może okazać się, że sam tworzysz kod tak, aby twoje C++ mogło dotrzeć do platformy w razie potrzeby. Oznacza to, że możesz mieć nagłówki z oddzielnymi plikami implementacyjnymi dla każdej platformy.

  • thing.h
  • thing_android.cpp
  • thing_ios.mm

aplikacji na Androida w Android.mk plik będzie zawierał thing_android.cpp (ale nie thing_ios.mm). Ten plik może przekroczyć most JNI, aby w razie potrzeby porozmawiać z Javą, gdy tylko potrzebujesz czegoś z zestawu SDK Androida.

Aplikacja na iOS będzie zawierać thing_ios.mm (ale nie thing_android.cpp). Rozszerzenie .mm oznacza Objective-C++, dzięki czemu plik może bezpośrednio wywoływać potężne biblioteki Cocoa w razie potrzeby.

Wreszcie, na wszystkich platformach, powinieneś być pewien, aby zmniejszyć wykorzystanie C++ do najniższego wspólnego mianownika. Innymi słowy, jeśli iOS obsługuje konkretną funkcję C++, a Android nie, to nie możesz użyć tej konkretnej funkcji.

+0

Dziękuję za wyczerpującą odpowiedź. Czytałem o pakiecie narzędzi NDK. Czy można użyć programu Visual Studio 2015 do napisania biblioteki międzyplatformowej dla systemu Android/iOS (która kompiluje się do '.so' i' .a'? Lub co byś poleciła? – Z0q

+1

Nie rozumiem, dlaczego nie mogłeś " Zrób to - dla niektórych firm, które chcą zachować swoje źródło biblioteki zamknięte, jest to standardowa praktyka, zdarzyło mi się używać Xcode, dla wygody testowania aplikacji na iOS bezpośrednio i dokonywania szybkich zmian zarówno w źródle Objective-C, jak i C++ kod, ale w tym samym duchu skompilowałem również kod C++ bezpośrednio do kompilacji Androida, która zgłosi problemy kompilacji z góry. – drhr

+1

Dziękuję. Jak mogę skompilować do '.so' i' .a'? – Z0q

Powiązane problemy