샘플

Android 게임 개발 확장 프로그램의 샘플은 확장 프로그램의 주요 기능을 사용하는 방법을 보여줍니다. 이 주제에서는 샘플과 샘플 실행에 필요한 설정을 설명합니다.

다운로드 페이지에서 다음 샘플을 확인할 수 있습니다.

  • HelloJNI: 입문 프로젝트
  • Endless-Tunnel: Android 전용 프로젝트
  • Teapot: Windows 및 Android용 크로스 플랫폼 프로젝트
  • AssemblyCode-Link-Objects: 어셈블리 소스 코드가 있는 템플릿 프로젝트

시작하기 전에

  • Android 게임 개발 확장 프로그램 및 샘플을 설치합니다. 자세한 내용은 빠른 시작을 참고하세요. 또한 이 주제에서는 샘플을 빌드하고 실행하는 방법을 설명하고 Android 버전의 Teapot 샘플을 예제로 사용합니다.

  • 프로젝트 구성 가이드에서는 확장 프로그램을 사용하는 프로젝트의 설정을 구성(예: Android 플랫폼 및 APK 추가)하는 방법을 설명합니다.

HelloJNI

HelloJNI 샘플은 앱 창에 'Hello From JNI' 메시지를 표시하는 간단한 프로젝트입니다. 이 프로젝트는 Windows와 Android에 서로 다른 소스 코드 세트를 사용합니다.

  • Android 소스 코드 및 Gradle 빌드 스크립트 디렉터리: HelloJNI\AndroidPackaging
  • Windows 소스 코드 및 Visual Studio 프로젝트 디렉터리: HelloJNI

프로젝트를 빌드하면 Visual Studio가 앱 수준의 build.gradle 파일에 다음 설정을 전달합니다. Gradle 빌드 스크립트를 수정하면 이 설정을 변경할 수 있습니다.

  • MSBUILD_NDK_VERSION
  • MSBUILD_MIN_SDK_VERSION
  • MSBUILD_JNI_LIBS_SRC_DIR
  • MSBUILD_ANDROID_OUTPUT_APK_NAME
  • MSBUILD_ANDROID_GRADLE_BUILD_OUTPUT_DIR

샘플을 설정하고 실행하는 방법은 다음과 같습니다.

  1. Visual Studio에서 HelloJNI 샘플을 열고 빌드합니다.
  2. Android arm64-v8a 플랫폼을 추가합니다. 자세한 내용은 Android 플랫폼 추가를 참고하세요.
  3. 새 플랫폼에 Android APK 항목을 추가합니다.
  4. 프로젝트를 컴파일합니다.
  5. 다음 Android 플랫폼을 추가한 다음 각 플랫폼에 Android APK 항목을 추가합니다. Android-armeabi-v7a, Android-x86, Android-x86_64
  6. 샘플을 빌드하고 실행합니다.

Endless-Tunnel

Endless-Tunnel 샘플은 플레이어가 터널 끝에 도달하기 위해 노력하며 흰색 큐브를 수집하는 Android 게임입니다. GitHub의 Android NDK 저장소에 있는 OpenGL 샘플에서 포팅한 것입니다. 이 샘플은 Windows 버전의 게임을 제공하지 않습니다.

샘플에는 이미 설정과 Android 플랫폼이 구성되어 있으므로 수정 없이 Visual Studio에서 프로젝트를 빌드하고 실행할 수 있습니다. 솔루션을 열면 Solution Explorer(솔루션 탐색기)에 다음 모듈이 표시됩니다.

  • endless-tunnel: 게임 로직을 표시하는 애플리케이션 모듈
  • glm: 정적 라이브러리로 빌드된 OpenGL Math 저장소의 스냅샷
  • native_app_glue: NativeActivity 객체와 통신하는 NDK 래퍼

Teapot

Teapot 샘플은 OpenGL ES로 렌더링되고 Android 게임 개발 확장 프로그램에 포팅된 기존 Teapot을 표시하여 다음 기능을 보여줍니다.

  • 크로스 플랫폼 프로젝트 개발: Windows 및 Android용 Teapot 샘플을 빌드할 수 있습니다.
  • 맞춤 Android 패키징 사용: Gradle 빌드 스크립트가 Teapot.sln 파일이 있는 샘플 루트 디렉터리로 이동했습니다.

Teapot 샘플 구현은 여러 부분으로 나뉘며 대규모 크로스 플랫폼 애플리케이션과 게임에 일반적입니다.

  • GameApplication 모듈: 사용자가 Teapot을 회전하거나 애플리케이션 통계를 업데이트하는 등의 사용자 작업과 애플리케이션 상태를 정의합니다.
  • GameEngine 모듈: 코어 렌더링 모듈을 구현합니다.

샘플을 설정하고 Android에서 실행하려면 빠른 시작을 참고하세요. 샘플을 설정하고 Windows에서 실행하는 방법은 다음과 같습니다.

  1. GLEW를 설치합니다.
    1. GLEW를 다운로드하고 압축을 풉니다.
    2. $your-glew-directory\bin\Release\x64에서 %SystemRoot%\system32로 바이너리 파일을 복사합니다.
  2. freeglut을 설치합니다.
    1. freeglut을 다운로드하고 압축을 풉니다.
    2. $your-freeglut-directory\bin\x86\freeglut.dll%SystemRoot%\system32로 복사합니다.
  3. freeglut 프로젝트 종속 항목을 추가합니다.
    1. Visual Studio에서 Teapot.sln을 엽니다.
    2. 메뉴에서 Debug(디버그) > x64 > Local Windows Debugger(로컬 Windows 디버거)를 클릭합니다.
    3. Solution Explorer(솔루션 탐색기)에서 GameApplication을 마우스 오른쪽 버튼으로 클릭하고 Properties(속성) > C/C++ > General(일반) > Additional Include Directories(추가 포함 디렉터리)를 선택합니다.
    4. 경로에 $your-freeglut-dir\include를 추가합니다.
      'Additional Include Directories'(추가 포함 디렉터리) 대화상자의 스크린샷
    5. OK(확인)를 클릭합니다.
    6. Linker(링커) > General(일반) > Additional Library Directories(추가 라이브러리 디렉터리)를 선택합니다.
    7. 경로에 $your-freeglut-dir\lib\x64를 추가합니다. 'Additional Library Directories'(추가 라이브러리 디렉터리) 대화상자의 스크린샷
    8. OK(확인)를 클릭합니다.
    9. Linker(링커) > General(일반) > Additional Library Directories(추가 라이브러리 디렉터리)를 선택합니다.
    10. 경로에 freeglut.lib를 추가합니다.
    11. OK(확인)를 클릭합니다.
  4. GLEW 프로젝트 종속 항목을 추가합니다.
    1. Solution Explorer(솔루션 탐색기) 창에서 GameApplication을 마우스 오른쪽 버튼으로 클릭하고 Properties(속성) > C/C++ > General(일반) > Additional Include Directories(추가 포함 디렉터리)를 선택합니다.
    2. 경로에 $your-glew-dir\include를 추가합니다.
    3. OK(확인)를 클릭합니다.
    4. Linker(링커) > General(일반) > Additional Library Directories(추가 라이브러리 디렉터리)를 선택합니다.
    5. 경로에 $your-glew-dir\lib\Release\x86를 추가합니다.
    6. OK(확인)를 클릭합니다.
    7. Linker(링커) > General(일반) > Additional Library Directories(추가 라이브러리 디렉터리)를 선택합니다.
    8. 경로에 glew32.lib를 추가합니다.
    9. OK(확인)를 클릭합니다.
  5. Windows에서 샘플 실행:
    1. Visual Studio 툴바에서 Local Windows Debugger(로컬 Windows 디버거) 실행 버튼을 클릭합니다.
    2. 샘플은 다음과 같이 표시됩니다.
      Windows에서 실행되는 Teapot 샘플의 스크린샷

어셈블리 소스 코드 및 C/C++ 소스 코드에서 Android 네이티브 라이브러리를 생성하는 방법을 보여주는 템플릿 프로젝트입니다. 기본 구성요소는 다음과 같습니다.

  • AssemblyCode-Link-Objects: C++ 소스 코드 및 어셈블리 소스 코드에서 빌드된 기본 Android 네이티브 라이브러리
  • StaticLib: from_static_lib_assembly_code_as 함수를 내보내는 도우미 정적 라이브러리

프로젝트는 여러 아키텍처를 지원합니다. 지원되는 각 아키텍처에는 StaticLib에서 내보낸 함수를 구현하는 자체 소스 파일이 있습니다. 빌드 중인 플랫폼의 어셈블리 소스 파일만 포함해야 합니다. 이 프로젝트는 맞춤 빌드 도구를 사용하여 빌드에 어셈블리 파일을 포함합니다.

샘플을 설정하고 빌드하는 방법은 다음과 같습니다.

  1. Visual Studio에서 어셈블리 파일에 맞춤 빌드 도구가 구성되어 있는지 확인합니다.
    1. Solution Explorer(솔루션 탐색기)에서 어셈블리 파일을 마우스 오른쪽 버튼으로 클릭하고 Properties(속성)를 클릭합니다. 그러면 파일의 Properties Pages(속성 페이지) 대화상자가 열립니다.
    2. 구성 및 플랫폼을 선택합니다(예: Android-arm64-v8a 플랫폼의 경우 All configurations(모든 구성) 선택).
    3. General(일반) > Exclude from Build(빌드에서 제외)No(아니요)로 설정되어 있는지 확인합니다.
    4. General(일반) > Item Type(항목 유형)Custom Build Tool(맞춤 빌드 도구)로 설정되어 있는지 확인합니다.
    5. 적용할 변경사항이 있으면 Apply(적용)를 클릭합니다.
    6. Configuration Properties(구성 속성) > Custom Build Tools(맞춤 빌드 도구) > Command Line(명령줄)$(AsToolExe) -o "$(IntDir)%(FileName).o" %(FullPath)로 설정되어 있는지 확인합니다. NDK에는 각 CPU 아키텍처용으로 별도의 어셈블러가 포함되어 있으며 $(AsToolExe)는 올바른 어셈블러에 매핑됩니다. 이 샘플에서는 NDK 도구 모음을 사용하여 x86 Android 프로젝트와 x86_64 Android 프로젝트를 모두 빌드합니다. x86_64 Android 플랫폼에 yasm을 사용하려면 대신 $(YasmToolExe)를 사용하세요.
    7. Configuration Properties(구성 속성) > Custom Build Tools(맞춤 빌드 도구) > Outputs(출력)$(IntDir)%(FileName).o로 설정되어 있는지 확인합니다. 이 문자열은 Command Line(명령줄) 설정에 포함되어야 합니다.
    8. Configuration Properties(구성 속성) > Custom Build Tools(맞춤 빌드 도구) > Link Objects(링크 객체)Yes로 설정되어 있는지 확인합니다.

    예를 들어 Android-arm64-v8a 설정은 다음 스크린샷과 유사합니다.

    'Custom Build Tools'(맞춤 빌드 도구)의 'Property Page'(속성 페이지) 스크린샷
  2. 프로젝트를 빌드합니다. 그러면 libAssmeblyCodeLinkObjects.so 파일이 빌드됩니다.
    1. AssemblyCode-Link-Objects.sln 파일을 엽니다.
    2. 메뉴에서 Build(빌드) > Build Solution(솔루션 빌드)을 클릭합니다.
  3. 함수를 Android 라이브러리로 올바르게 내보냈는지 확인하려면 nm.exe NDK 도구를 사용하세요.
    1. 명령줄에서 샘플 디렉터리로 이동합니다.
    2. 빌드에서 생성된 Android 라이브러리 위치로 이동합니다. 기본 위치는 arm64-v8a 플랫폼의 $sample_dir\$solution_configuration\$solution_platform\$platform$sample_dir\Debug\Android-arm64-v8a\arm64-v8a와 유사합니다.
    3. 다음 명령어를 실행하여 내보낸 기호 섹션에 함수가 포함되어 있는지 확인합니다.
        …\ndk\toolschains\llvm\prebuilt\windows-x86_64\aarch64-linux-android\bin\nm.exe --defined-only …\Debug\Android-arm64-v8a\arm64-v8a\libAssmeblyCodeLinkObjects.so
      

      출력에 다음이 포함된 기호의 목록이 표시됩니다.

         T from_shared_object_assembly_code_as
         T from_static_lib_assembly_code_as