Sample

Przykłady rozszerzenia do tworzenia gier na Androida pokazują, jak korzystać z najważniejszych funkcji tego rozszerzenia. W tym temacie opisujemy przykłady i ustawienia niezbędne do ich uruchomienia.

Na stronie pobierania dostępne są te próbki:

  • HelloJNI: projekt wprowadzający.
  • Endless-Tunnel: projekt tylko na Androida.
  • Teapot: wieloplatformowy projekt na Windowsa i Androida.
  • AssemblyCode-Link-Objects: projekt szablonu z kodem źródłowym zestawu.

Zanim zaczniesz

  • Zainstaluj rozszerzenie Android Game Development i przykłady. Więcej informacji znajdziesz w krótkim wprowadzeniu. Omówiono w nim również, jak utworzyć i uruchomić przykładowy kod, a także jak wykorzystać wersję Teapot w wersji na Androida.

  • Przewodnik po konfiguracji projektu opisuje, jak skonfigurować ustawienia projektu, który korzysta z rozszerzenia, np. dodać platformę Androida i plik APK.

HelloJNI

Przykładowy HelloJNI to prosty projekt, który wyświetla komunikat „Hello from JNI” w oknie aplikacji. Projekt używa innego zestawu kodu źródłowego dla systemów Windows i Android.

  • Kod źródłowy Androida i katalog skryptów kompilacji Gradle: HelloJNI\AndroidPackaging
  • Kod źródłowy Windows i katalog projektów Visual Studio: HelloJNI

Gdy tworzysz projekt, Visual Studio przekazuje poniższe ustawienia do pliku build.gradle na poziomie aplikacji. Możesz zmienić te ustawienia, modyfikując skrypty kompilacji Gradle.

  • MSBUILD_NDK_VERSION
  • MSBUILD_MIN_SDK_VERSION
  • MSBUILD_JNI_LIBS_SRC_DIR
  • MSBUILD_ANDROID_OUTPUT_APK_NAME
  • MSBUILD_ANDROID_GRADLE_BUILD_OUTPUT_DIR

Aby skonfigurować i uruchomić przykład:

  1. W Visual Studio otwórz i skompiluj próbkę HelloJNI.
  2. Dodaj platformę Android arm64-v8a. Więcej informacji znajdziesz w artykule o dodawaniu platformy Androida.
  3. Dodaj element APK na Androida do nowej platformy.
  4. Skompilować projekt.
  5. Dodaj te platformy Androida, a następnie do każdej z nich dodaj element APK na Androida: Android-armeabi-v7a, Android-x86 i Android-x86_64.
  6. Utwórz i uruchom przykład.

Niekończący się tunel

W grze Endless-Tunnel na Androida gracz zbiera białe kostki, próbując dotrzeć do końca tunelu. Został przeniesiony z próbki OpenGL w repozytorium Android NDK w GitHub Przykład nie zawiera gry w wersji na system Windows.

Przykład ma już skonfigurowane ustawienia i platformy Androida, więc możesz utworzyć i uruchomić projekt w Visual Studio bez żadnych modyfikacji. Po otwarciu rozwiązania Eksplorator rozwiązań wyświetli te moduły:

  • niekończący się tunel: moduł aplikacji wyświetlający logikę gry.
  • glm: zrzut repozytorium OpenGL Math utworzonego jako biblioteka statyczna.
  • natywne_app_glue: kod NDK, który komunikuje się z obiektem NativeActivity.

Imbryk

Przykład Teapot wyświetla klasyczny imbryk renderowany w standardzie OpenGL ES i przeniesiony do rozszerzenia Android Game Development Extension, by zademonstrować te funkcje:

  • Tworzenie projektów na wielu platformach: możesz utworzyć przykładową aplikację Teapot na Windows i Androida.
  • Użycie niestandardowego pakietu na Androida: skrypty kompilacji Gradle zostały przeniesione do katalogu głównego próbki, w którym znajduje się plik Teapot.sln.
  • Eksperymentalna integracja kompilacji Ninja umożliwiająca otwieranie projektu w Android Studio.
  • Niestandardowe konfiguracje Androida pokazujące, jak używać narzędzi Address Sanitizer (ASan) i Hardware Address Sanitizer (HWAsan).

Implementacja próbki Teapot jest podzielona na wiele części, co jest typowe w przypadku dużych aplikacji i gier na wielu platformach:

  • Moduł GameApplication: definiuje działania użytkownika i stany aplikacji, np. obracający imbryk czy aktualizowanie statystyk aplikacji.
  • Moduł GameEngine: implementuje główny moduł renderowania.

Aby skonfigurować przykład i uruchomić go na urządzeniu z Androidem, przeczytaj krótkie wprowadzenie. Aby skonfigurować przykład i uruchomić go w systemie Windows:

  1. Zainstaluj GLEW:
    1. Pobierz i rozpakuj GLEW.
    2. Skopiuj pliki binarne z $your-glew-directory\bin\Release\x64 do %SystemRoot%\system32.
  2. Zainstaluj freeglut:
    1. Pobierz i rozpakuj freeglut.
    2. Skopiuj $your-freeglut-directory\bin\x86\freeglut.dll do %SystemRoot%\system32.
  3. Dodaj zależności projektu freeglut:
    1. Otwórz Teapot.sln w Visual Studio.
    2. W menu kliknij Debugowanie > x64 > Lokalny debuger Windows.
    3. W Eksploratorze rozwiązań kliknij prawym przyciskiem myszy GameApplication i wybierz Właściwości > C/C++ > Ogólne > Dodatkowe katalogi.
    4. Dodaj do ścieżki element $your-freeglut-dir\include.
      Zrzut ekranu przedstawiający okno Dodatkowe katalogi.
    5. Kliknij OK.
    6. Wybierz Linker > Ogólne > Dodatkowe katalogi bibliotek.
    7. Dodaj do ścieżki element $your-freeglut-dir\lib\x64. Zrzut ekranu przedstawiający okno Dodatkowe katalogi bibliotek.
    8. Kliknij OK.
    9. Wybierz Linker > Ogólne > Dodatkowe katalogi bibliotek.
    10. Dodaj do ścieżki element freeglut.lib.
    11. Kliknij OK.
  4. Dodaj zależności projektu GLEW:
    1. W panelu Eksplorator rozwiązań kliknij prawym przyciskiem myszy GameApplication i wybierz Właściwości > C/C++ > Ogólne > Dodatkowe katalogi.
    2. Dodaj do ścieżki element $your-glew-dir\include.
    3. Kliknij OK.
    4. Wybierz Linker > Ogólne > Dodatkowe katalogi bibliotek.
    5. Dodaj do ścieżki element $your-glew-dir\lib\Release\x86.
    6. Kliknij OK.
    7. Wybierz Linker > Ogólne > Dodatkowe katalogi bibliotek.
    8. Dodaj do ścieżki element glew32.lib.
    9. Kliknij OK.
  5. Uruchom przykład w systemie Windows:
    1. Na pasku narzędzi Visual Studio kliknij przycisk uruchamiania Local Windows Debugger (Lokalny debuger Windows).
    2. Przykład powinien wyglądać tak:
      Zrzut ekranu przedstawiający próbkę Teapot uruchomiony w systemie Windows.

To szablon, który pokazuje, jak wygenerować bibliotekę natywną Androida na podstawie kodu asemblera i kodu źródłowego w języku C/C++. Oto główne komponenty:

  • AssemblyCode-Link-Objects: główna biblioteka natywna na Androida, stworzona na podstawie języka C++ i kodu źródłowego komponentów.
  • StaticLib: pomocnicza biblioteka statyczna, która eksportuje funkcję from_static_lib_assembly_code_as.

Projekt obsługuje wiele architektur. Każda obsługiwana architektura ma własne pliki źródłowe, które implementują funkcje eksportowane z StaticLib. Uwzględnij tylko pliki źródłowe asemblera dla kompilowanych platform. Ten projekt zawiera pliki asemblera w kompilacjach przy użyciu niestandardowych narzędzi do kompilacji.

Aby skonfigurować i utworzyć przykład:

  1. W Visual Studio sprawdź, czy na potrzeby plików asemblera są skonfigurowane niestandardowe narzędzia do kompilacji:
    1. W Eksploratorze rozwiązań kliknij prawym przyciskiem myszy plik zestawu, a następnie kliknij Właściwości. Otworzy się okno Strony właściwości pliku.
    2. Wybierz konfigurację i platformę, np. Wszystkie konfiguracje na potrzeby Android-arm64-v8a.
    3. Sprawdź, czy opcja Ogólne > Wyklucz z kompilacji jest ustawiona na Nie.
    4. Sprawdź, czy Ogólne > Typ elementu jest ustawione na Custom Build Tool (Narzędzie do tworzenia niestandardowego).
    5. Jeśli chcesz wprowadzić zmiany, kliknij Zastosuj.
    6. Sprawdź, czy opcja Configuration Właściwości > Custom Build Tools > Command Line (Właściwości konfiguracji > Niestandardowe narzędzia kompilacji > Wiersz poleceń:) jest ustawiona na $(AsToolExe) -o "$(IntDir)%(FileName).o" %(FullPath). Pakiet NDK zawiera oddzielny asemrator dla każdej architektury procesora, a $(AsToolExe) jest mapowany na prawidłowy kompilator. W tym przykładzie korzystamy z łańcucha narzędzi NDK do tworzenia projektów Androida x86 i x86_64. Jeśli na platformę Androida x86_64 chcesz użyć kodu yasm, zamiast tego użyj $(YasmToolExe).
    7. Sprawdź, czy opcję Configuration Właściwości > Custom Build Tools > outputs (Właściwości konfiguracji > Niestandardowe narzędzia kompilacji > Dane wyjściowe:) ustawiono na $(IntDir)%(FileName).o. Ten ciąg znaków musi być zawarty w ustawieniu Wiersz poleceń.
    8. Sprawdź, czy opcja Configuration Właściwości > Custom Build Tools > Link Objects (Właściwości konfiguracji > Niestandardowe narzędzia kompilacji > Obiekty połączenia) jest ustawiona na Yes.

    Na przykład ustawienia Android-arm64-v8a powinny wyglądać podobnie do tego zrzutu ekranu:

    Zrzut ekranu strony usługi dla niestandardowych narzędzi do tworzenia kompilacji.
  2. Skompilujesz projekt. Spowoduje to utworzenie pliku libAssmeblyCodeLinkObjects.so:
    1. Otwórz plik AssemblyCode-Link-Objects.sln.
    2. W menu kliknij Kompilacja > Utwórz rozwiązanie.
  3. Aby sprawdzić, czy funkcje zostały prawidłowo wyeksportowane do biblioteki Androida, użyj narzędzia NDK nm.exe:
    1. W wierszu poleceń przejdź do przykładowego katalogu.
    2. Przejdź do lokalizacji biblioteki Androida, która została wygenerowana przez kompilację. Lokalizacja domyślna jest podobna do $sample_dir\$solution_configuration\$solution_platform\$platform i $sample_dir\Debug\Android-arm64-v8a\arm64-v8a w przypadku platformy arm64-v8a.
    3. Sprawdź, czy sekcja wyeksportowanych symboli zawiera funkcje, uruchamiając to polecenie:
        …\ndk\toolschains\llvm\prebuilt\windows-x86_64\aarch64-linux-android\bin\nm.exe --defined-only …\Debug\Android-arm64-v8a\arm64-v8a\libAssmeblyCodeLinkObjects.so
      

      W danych wyjściowych powinna pojawić się lista symboli, które obejmują te elementy:

         T from_shared_object_assembly_code_as
         T from_static_lib_assembly_code_as