如何设置 NDK 项目以编译多个目标平台





5.00/5 (2投票s)
Golden Hammer Software 今年早些时候前往纽约参加了 Intel Android CodeFest。 在那个周末,我们更新了《Big Mountain Snowboarding》、《Trick Shot Bowling》和《Scribble Worm》,使其在 Intel Android 设备上以原生方式运行。 这三款游戏都通过 NDK 使用 C++。
引言
Golden Hammer Software 今年早些时候前往纽约参加了 Intel Android CodeFest。 在那个周末,我们更新了《Big Mountain Snowboarding》、《Trick Shot Bowling》和《Scribble Worm》,使其在 Intel Android 设备上以原生方式运行。 这三款游戏都通过 NDK 使用 C++。
基于 Java 的应用程序不需要为 Intel 设备进行任何额外的工作。 为 ARM 编译的 C++ 应用程序将通过运行时解释器在 Intel 设备上运行。 对于处理器密集型 C++ 应用程序,从为 ARM 和 x86 进行交叉编译中获益。 原生的 x86 代码在 x86 设备上应该更快更有效。 本文展示了设置 NDK 项目以编译为多个目标平台所涉及的步骤。
为多个架构编译 C++
第一步是编辑 Application.mk 文件,以在 APP_ABI 标志下添加其他平台。 可以将“all”放在此处,以便为 Android 支持的每个架构创建一个 .so 文件,但编译时间会非常长。 除非您使用特殊的 armv7 API 调用,否则 x86 和 armeabi 应该足够了。 这将创建两个 .so 文件。 不幸的是,它也会使编译时间加倍。
Application.mk
APP_ABI := x86 armeabi
将 .so 文件与 Java 项目链接
这两个 .so 文件将在 [ndk 项目目录]\libs\armabi 和 [ndk 项目目录]\libs\x86 中创建。 它们需要复制到 Android Java 项目下的单独目录中。
我们使用一个简单的 bat 文件,每次编译时为我们复制文件。 此文件位于我们的 NDK\[Project]\jni 文件夹中。
CMD /C ..\..\..\..\..\..\contrib\android-ndk-r9c\ndk-build
copy ..\libs\armeabi\libGHBowling.so ..\..\..\GHBowling\libs\armeabi\libGHBowling.so
copy ..\libs\x86\libGHBowling.so ..\..\..\GHBowling\libs\x86\libGHBowling.so
支持多个 C++ 库
我们的游戏使用多个 C++ 库。 我们将与游戏无关的代码放在一个库中,将游戏代码放在第二个库中。 游戏库需要与与游戏无关的库链接。 在仅支持 ARM 时,我们能够添加从一个项目到另一个项目的具体相对路径,但是处理多个目标时必须更新 Android.mk 文件。 标志 $(TARGET_ARCH_ABI) 将在每次编译传递期间获取相应的库。
Android.mk
include $(CLEAR_VARS)
LOCAL_MODULE := libGHEngine
LOCAL_SRC_FILES := ../../GHEngine/obj/local/$(TARGET_ARCH_ABI)/libGHEngine.a
include $(PREBUILT_STATIC_LIBRARY)
编译器差异
我强烈建议在实际的 Intel Android 设备上进行测试。 存在细微的编译器差异。 我们遇到了一个空指针崩溃,该崩溃直到我们为 x86 编译后才暴露出来。 这是一个真实存在的 bug,存在于所有平台上,但是不知何故,其他编译器设法创建了可以在访问超出范围的内存时起作用的代码。 当我们在三星 Intel Android 平板电脑上运行 x86 Android 代码时,该游戏在启动时崩溃,直到我们找到并修复了该错误。
最终想法
Intel 已经创建了一系列工具,可以更轻松地进行 Android 开发,这些工具可以在 https://software.intel.com/en-us/android/tools 找到。 这些工具包括模拟器、图形分析器、跨平台库和完整的游戏引擎。 我们也受益于 Intel® Developer Zone 计划,例如 Intel Android Showcase。
在您的 C++ 应用程序中支持 Intel Android 是一个相当简单的过程。 ARM C++ 库可能无需修改即可工作,但是进行一些简单的 makefile 更改将使它们运行得更有效率。 Java 应用程序不需要任何更改即可支持新硬件。
相关文章与资源
- 使用案例研究进行 Android* 上的 NFC 应用开发
- 在 Android* 商业应用程序中实现地图和地理围栏功能
- 自动化 Android* 应用程序测试
- 如何在 Intel 架构上优化您的 Android* 应用 (NDK) - 两分钟搞定
- 如何设置 NDK 项目以编译适用于多个目标平台的应用
作者简介
David Wingrove 拥有四年制作 Android 应用程序的经验和 14 年制作游戏的经验。 他是 Golden Hammer Software 的联合创始人,并发布了适用于 Android、Wii、PC、iOS、Blackberry 和其他平台的游戏。