65.9K
CodeProject 正在变化。 阅读更多。
Home

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

2014 年 8 月 14 日

CPOL

3分钟阅读

viewsIcon

13229

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 应用程序不需要任何更改即可支持新硬件。

相关文章与资源

作者简介

David Wingrove 拥有四年制作 Android 应用程序的经验和 14 年制作游戏的经验。 他是 Golden Hammer Software 的联合创始人,并发布了适用于 Android、Wii、PC、iOS、Blackberry 和其他平台的游戏。

© . All rights reserved.