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 中构建和运行该项目。打开解决方案后,“解决方案资源管理器”将显示以下模块
- endless-tunnel:显示游戏逻辑的应用程序模块。
- glm:作为静态库构建的OpenGL Math 代码库的快照。
- native_app_glue:与NativeActivity对象通信的 NDK 包装器。
Teapot
Teapot 示例显示了一个经典茶壶,它使用 OpenGL ES 渲染,并移植到 Android 游戏开发扩展以演示以下功能
- 跨平台项目开发:您可以为 Windows 和 Android 构建 Teapot 示例。
- 自定义 Android 打包使用:Gradle 构建脚本已移动到示例的根目录,
Teapot.sln
文件位于该目录。 - 演示如何使用Address Sanitizer (ASan) 和Hardware Address Sanitizer (HWAsan) 的自定义 Android 配置。
Teapot 示例的实现分为多个部分,这对于大型跨平台应用程序和游戏来说是典型的
GameApplication
模块:定义用户操作和应用程序状态,例如用户旋转茶壶或更新应用程序统计信息。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
。 - 在菜单中,点击**调试 > x64 > 本地Windows调试器**。
- 在**解决方案资源管理器**中,右键单击**GameApplication**并选择**属性 > C/C++ > 常规 > 附加包含目录**。
- 将
$your-freeglut-dir\include
添加到路径。
- 点击**确定**。
- 选择**链接器 > 常规 > 附加库目录**。
- 将
$your-freeglut-dir\lib\x64
添加到路径。 - 点击**确定**。
- 选择**链接器 > 常规 > 附加库目录**。
- 将
freeglut.lib
添加到路径。 - 点击**确定**。
- 在Visual Studio中打开
- 添加GLEW项目依赖项
- 在**解决方案资源管理器**窗格中,右键单击**GameApplication**并选择**属性 > C/C++ > 常规 > 附加包含目录**。
- 将
$your-glew-dir\include
添加到路径。 - 点击**确定**。
- 选择**链接器 > 常规 > 附加库目录**。
- 将
$your-glew-dir\lib\Release\x86
添加到路径。 - 点击**确定**。
- 选择**链接器 > 常规 > 附加库目录**。
- 将
glew32.lib
添加到路径。 - 点击**确定**。
- 在Windows上运行示例
- 在Visual Studio工具栏上,点击**本地Windows调试器**运行按钮。
- 示例应如下所示
AssemblyCode-Link-Objects
这是一个模板项目,演示如何从汇编和C/C++源代码生成Android原生库。以下是主要组件:
AssemblyCode-Link-Objects
:从C++和汇编源代码构建的主要Android原生库。StaticLib
:一个辅助静态库,导出from_static_lib_assembly_code_as
函数。
该项目支持多种架构。每个受支持的架构都有自己的源文件,这些文件实现从StaticLib
导出的函数。您应该只包含您正在构建的平台的汇编源文件。此项目使用自定义构建工具在构建中包含汇编文件。
设置和构建示例
- 在Visual Studio中,验证是否为汇编文件配置了自定义构建工具。
- 在**解决方案资源管理器**中,右键单击汇编文件,然后单击**属性**。这将打开该文件的**属性页**对话框。
- 选择配置和平台,例如,对于**Android-arm64-v8a**选择**所有配置**。
- 确保**常规 > 从生成中排除**设置为**否**。
- 确保**常规 > 项目类型**设置为**自定义生成工具**。
- 如果有要应用的更改,请单击**应用**。
- 确保**配置属性 > 自定义生成工具 > 命令行**设置为
$(AsToolExe) -o "$(IntDir)%(FileName).o" %(FullPath)
。NDK为每个CPU架构包含一个单独的汇编程序,而$(AsToolExe)
映射到正确的汇编程序。此示例使用NDK工具链来构建x86和x86_64 Android项目。如果要为x86_64 Android平台使用yasm,请改用$(YasmToolExe)
。 - 确保**配置属性 > 自定义生成工具 > 输出**设置为
$(IntDir)%(FileName).o
。此字符串必须包含在**命令行**设置中。 - 确保**配置属性 > 自定义生成工具 > 链接对象**设置为
是
。
例如,**Android-arm64-v8a**设置应类似于以下屏幕截图
- 构建项目。这将构建
libAssmeblyCodeLinkObjects.so
文件。- 打开
AssemblyCode-Link-Objects.sln
文件。 - 在菜单中,单击**生成 > 生成解决方案**。
- 打开
- 要确认函数已正确导出到Android库,请使用nm.exe NDK工具。
- 在命令行中,转到示例目录。
- 转到构建生成的Android库位置。默认位置类似于
$sample_dir\$solution_configuration\$solution_platform\$platform
和$sample_dir\Debug\Android-arm64-v8a\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