在Intel Android设备上编译C++应用程序

在droid 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 project dir]\libs\armabi和[ndk project dir]\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)

编译器差异

强烈建议在实际的IntelAndroid设备上进行测试。存在微妙的编译器差异。有一个空指针崩溃,直到为x86编译时才暴露出来。这是一个真实存在的bug,它在所有平台上都存在,但不知何故,其他编译器创建的代码在访问越界内存时能够正常工作。当在三星Intel Android平板上运行x86 Android代码时,游戏在启动时崩溃,直到找到并修复了bug。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485