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
샘플을 설정하고 실행하는 방법은 다음과 같습니다.
- Visual Studio에서 HelloJNI 샘플을 열고 빌드합니다.
- Android arm64-v8a 플랫폼을 추가합니다. 자세한 내용은 Android 플랫폼 추가를 참고하세요.
- 새 플랫폼에 Android APK 항목을 추가합니다.
- 프로젝트를 컴파일합니다.
- 다음 Android 플랫폼을 추가한 다음 각 플랫폼에 Android APK 항목을 추가합니다. Android-armeabi-v7a, Android-x86, Android-x86_64
- 샘플을 빌드하고 실행합니다.
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
파일이 있는 샘플 루트 디렉터리로 이동했습니다. - Android 스튜디오에서 프로젝트를 열 수 있는 실험용 Ninja 빌드 통합
- 사용 방법을 보여주는 맞춤 Android 구성 Address Sanitizer (ASan) 및 Hardware Address Sanitizer (HWAsan)
Teapot 샘플 구현은 여러 부분으로 나뉘며 대규모 크로스 플랫폼 애플리케이션과 게임에 일반적입니다.
GameApplication
모듈: 사용자가 Teapot을 회전하거나 애플리케이션 통계를 업데이트하는 등의 사용자 작업과 애플리케이션 상태를 정의합니다.GameEngine
모듈: 코어 렌더링 모듈을 구현합니다.
샘플을 설정하고 Android에서 실행하려면 빠른 시작을 참고하세요. 샘플을 설정하고 Windows에서 실행하는 방법은 다음과 같습니다.
- GLEW를 설치합니다.
- GLEW를 다운로드하고 압축을 풉니다.
$your-glew-directory\bin\Release\x64
에서%SystemRoot%\system32
로 바이너리 파일을 복사합니다.
- freeglut을 설치합니다.
- freeglut을 다운로드하고 압축을 풉니다.
$your-freeglut-directory\bin\x86\freeglut.dll
을%SystemRoot%\system32
로 복사합니다.
- freeglut 프로젝트 종속 항목을 추가합니다.
- Visual Studio에서
Teapot.sln
을 엽니다. - 메뉴에서 Debug(디버그) > x64 > Local Windows Debugger(로컬 Windows 디버거)를 클릭합니다.
- Solution Explorer(솔루션 탐색기)에서 GameApplication을 마우스 오른쪽 버튼으로 클릭하고 Properties(속성) > C/C++ > General(일반) > Additional Include Directories(추가 포함 디렉터리)를 선택합니다.
- 경로에
$your-freeglut-dir\include
를 추가합니다.
- OK(확인)를 클릭합니다.
- Linker(링커) > General(일반) > Additional Library Directories(추가 라이브러리 디렉터리)를 선택합니다.
- 경로에
$your-freeglut-dir\lib\x64
를 추가합니다. - OK(확인)를 클릭합니다.
- Linker(링커) > General(일반) > Additional Library Directories(추가 라이브러리 디렉터리)를 선택합니다.
- 경로에
freeglut.lib
를 추가합니다. - OK(확인)를 클릭합니다.
- Visual Studio에서
- GLEW 프로젝트 종속 항목을 추가합니다.
- Solution Explorer(솔루션 탐색기) 창에서 GameApplication을 마우스 오른쪽 버튼으로 클릭하고 Properties(속성) > C/C++ > General(일반) > Additional Include Directories(추가 포함 디렉터리)를 선택합니다.
- 경로에
$your-glew-dir\include
를 추가합니다. - OK(확인)를 클릭합니다.
- Linker(링커) > General(일반) > Additional Library Directories(추가 라이브러리 디렉터리)를 선택합니다.
- 경로에
$your-glew-dir\lib\Release\x86
를 추가합니다. - OK(확인)를 클릭합니다.
- Linker(링커) > General(일반) > Additional Library Directories(추가 라이브러리 디렉터리)를 선택합니다.
- 경로에
glew32.lib
를 추가합니다. - Ok(확인)를 클릭합니다.
- Windows에서 샘플 실행:
- Visual Studio 툴바에서 Local Windows Debugger(로컬 Windows 디버거) 실행 버튼을 클릭합니다.
- 샘플은 다음과 같이 표시됩니다.
AssemblyCode-Link-Objects
어셈블리 소스 코드 및 C/C++ 소스 코드에서 Android 네이티브 라이브러리를 생성하는 방법을 보여주는 템플릿 프로젝트입니다. 기본 구성요소는 다음과 같습니다.
AssemblyCode-Link-Objects
: C++ 소스 코드 및 어셈블리 소스 코드에서 빌드된 기본 Android 네이티브 라이브러리StaticLib
:from_static_lib_assembly_code_as
함수를 내보내는 도우미 정적 라이브러리
프로젝트는 여러 아키텍처를 지원합니다. 지원되는 각 아키텍처에는 StaticLib
에서 내보낸 함수를 구현하는 자체 소스 파일이 있습니다.
빌드 중인 플랫폼의 어셈블리 소스 파일만 포함해야 합니다. 이 프로젝트는 맞춤 빌드 도구를 사용하여 빌드에 어셈블리 파일을 포함합니다.
샘플을 설정하고 빌드하는 방법은 다음과 같습니다.
- Visual Studio에서 어셈블리 파일에 맞춤 빌드 도구가 구성되어 있는지 확인합니다.
- Solution Explorer(솔루션 탐색기)에서 어셈블리 파일을 마우스 오른쪽 버튼으로 클릭하고 Properties(속성)를 클릭합니다. 그러면 파일의 Properties Pages(속성 페이지) 대화상자가 열립니다.
- 구성 및 플랫폼을 선택합니다(예: Android-arm64-v8a 플랫폼의 경우 All configurations(모든 구성) 선택).
- General(일반) > Exclude from Build(빌드에서 제외)가 No(아니요)로 설정되어 있는지 확인합니다.
- General(일반) > Item Type(항목 유형)이 Custom Build Tool(맞춤 빌드 도구)로 설정되어 있는지 확인합니다.
- 적용할 변경사항이 있으면 Apply(적용)를 클릭합니다.
- 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)
를 사용하세요. - Configuration Properties(구성 속성) > Custom Build Tools(맞춤 빌드 도구) > Outputs(출력)가
$(IntDir)%(FileName).o
로 설정되어 있는지 확인합니다. 이 문자열은 Command Line(명령줄) 설정에 포함되어야 합니다. - Configuration Properties(구성 속성) > Custom Build Tools(맞춤 빌드 도구) > Link Objects(링크 객체)가
Yes
로 설정되어 있는지 확인합니다.
예를 들어 Android-arm64-v8a 설정은 다음 스크린샷과 유사합니다.
- 프로젝트를 빌드합니다. 그러면
libAssmeblyCodeLinkObjects.so
파일이 빌드됩니다.AssemblyCode-Link-Objects.sln
파일을 엽니다.- 메뉴에서 Build(빌드) > Build Solution(솔루션 빌드)을 클릭합니다.
- 함수를 Android 라이브러리로 올바르게 내보냈는지 확인하려면 nm.exe NDK 도구를 사용하세요.
- 명령줄에서 샘플 디렉터리로 이동합니다.
- 빌드에서 생성된 Android 라이브러리 위치로 이동합니다. 기본 위치는 arm64-v8a 플랫폼의
$sample_dir\$solution_configuration\$solution_platform\$platform
및$sample_dir\Debug\Android-arm64-v8a\arm64-v8a
와 유사합니다. - 다음 명령어를 실행하여 내보낸 기호 섹션에 함수가 포함되어 있는지 확인합니다.
…\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