如何在 Intel® 架构上为 Android 设置 FMOD、Cocos2D-x 和 OpenAL 库





5.00/5 (1投票)
本分步指南将指导您完成为 x86 目标平台设置和编译游戏和多媒体中使用的各种库的过程。
Intel® Developer Zone 提供跨平台应用程序开发工具和操作指南、平台和技术信息、代码示例以及同行专业知识,以帮助开发人员进行创新并取得成功。加入我们的 Android、物联网、Intel® RealSense™ 技术和 Windows 社区,下载工具,访问开发套件,与志同道合的开发人员分享想法,并参与黑客马拉松、竞赛、路演和本地活动。
之前,我们已经介绍了如何在 x86 架构上编译 FFmpeg 库的说明。本分步指南将指导您完成为 x86 目标平台设置和编译游戏和多媒体中使用的各种库的过程。我们将介绍 FMOD*、Cocos2D-x* 和 OpenAL* 的设置。
设置和先决条件
在开始之前,我们需要满足某些下载先决条件。
- 下载 Android ADT Bundle
- 下载 NDK
- 下载并安装 Cygwin*:在选择软件包时,搜索以下软件包并安装它们
Autoconf、Automake、binutils、gcc-core、gcc-g++、gcc4-core、gcc4-g++、gdb、pcre、pcre-devel、
gawk、make、python注意:请同时选择 make 的 GUI 版本;否则,您将无法使用 NDK 构建项目。
- 下载 JDK
- 下载 Apache Ant
现在需要编辑一些环境变量。
- 设置 JAVA_HOME = Java* JDK 的安装路径,我的路径是:C:\Program Files\Java\jdk1.7.0_45
- 设置 ANDROID_SDK_ROOT = SDK 文件夹的完整路径。例如:在我的情况下,我已将 ADT Bundle 下载并解压到 D:\android\,所以我的路径是:D:\android\adt-bundle-windows-x86-20131030\sdk
- 设置 NDK_ROOT = NDK 文件夹的完整路径,我的路径是:D:\android\android-ndk-r9b
- 设置 NDK_ROOT = NDK 文件夹的完整路径,我的路径是:D:\android\android-ndk-r9b
- 更新 Path 变量,使其包含以下内容 = JDK 文件夹、JDK bin 文件夹、NDK、Cygwin bin 文件夹、ANT bin 文件夹、SDK tools 文件夹和 SDK platform-tools 文件夹的路径,每个路径之间用分号 (;) 分隔。例如,在我的情况下,我将添加以下内容:
D:\cygwin64\bin;C:\Program Files\Java\jdk1.7.0_40\bin;D:\android\adt-bundle-windows-x86_64-20131030\sdk\tools;D:\android\adt-bundle-windows-x86_64-20131030\sdk\platform-tools;%JAVA_HOME%\bin;%ANT_HOME%\bin
注意:不要在任何变量末尾添加 \ 或 ` 或任何此类特殊字符。
FMOD
FMOD 是一款用于管理音频的商业库。FMOD 是一套音频内容创建工具,可在许多不同的操作系统平台上播放各种格式的音乐文件,这些平台用于游戏和软件应用程序以提供音频功能。以下是使用 Eclipse* IDE 将 FMOD 库集成到 Android 应用程序中,特别是针对 x86 目标平台的步骤指南。
下载 FMOD。下载 FMOD Ex Programmer’s API 的 Android 版本,如下所示。
要安装 FMOD,请使用 7-zip 等工具将“fmodapi44429android.tar.gz”解压到您选择的任何文件夹。
使用 Android NDK 构建
要通过 FMOD Ex API 实现声音,您必须将其作为 C/C++ 程序包含在代码中,并通过 Android 应用程序中的 jni
进行引用。
FMOD 提供了 C/C++ 库,可以通过 JNI 调用,或链接到您应用程序的 C/C++ 组件。
- libfmodex.so 用于一般开发。
- libfmodexL.so 用于相同的库,但具有调试日志记录功能,有助于在存在问题时进行诊断。
FMOD 库目前提供 armeabi 和 armeabi-v7a ABI 的版本,这些版本是针对 android-3 构建的,x86 ABI 是针对 android-9 构建的。
{$FMOD INSTALLED PATH}\api\lib\$(ABI)
所有原生音频接口 OpenSL 是支持它的设备(android-9)的默认播放方法,不需要额外的文件。对于不支持 OpenSL 的设备,您需要使用 Audio Track 输出模式,这需要一个 FMOD jar 文件。此 jar 文件必须添加到您的 Java 应用程序中,以初始化和驱动 FMOD 音频输出。
fmodex.jar
这将在下一个主题中讨论。
注意:由于此处使用的示例应用程序是库的一部分,因此我们未包含示例的代码;而是在本文档中仅说明了必要的修改。
Java 初始化
要通过 Audio Track 输出模式启用音频输出,您必须在应用程序中包含并初始化 FMOD Java 音频驱动程序(如果使用 OpenSL 输出模式,则无需此操作)。为此,您需要确保 fmodex.jar
已在您的 Java 项目中引用,并且您已导入 org.fmod.FMODAudioDevice
包。FMOD Java 音频驱动程序还要求您的应用程序加载 fmodex
库。
FMODAudioDevice
类有两个必须调用的函数才能播放音频。它们可以随时调用,但我们建议您将 start()
和 stop()
函数调用放在 Activity 的 onStart()
和 onStop()
重写中。
构建 x86 平台 Android 示例程序
构建程序的流程与通过 NDK 构建程序相同。让我们来看一个示例进行演示。在本例中,我们将使用位于文件夹中的示例程序
{$FMOD INSTALLED PATH}\examples\playsound
我们将此称为 {$PROJECT DIRECTORY}
。但在使用 NDK 构建它之前,我们需要进行一些更改。
- 转到 {$PROJECT DIRECTORY}\jni 目录并打开 Application.mk 文件。
- 更改以下代码
APP_ABI := armeabi armeabi-v7a
to
APP_ABI := x86
现在打开 Cygwin 并执行以下任务来构建应用程序
ndk-build
- 更新 Cygwin 中的 PATH 变量,如下所示
export PATH=.:/cygdrive/{$PATH TO NDK}:$PATH
- cd 到项目路径
cd /cygdrive/{$PROJECT DIRECTORY}
- 运行命令
- 这将构建项目并使其准备好进行部署。
注意:在这种情况下,将 Windows* 路径格式中的所有“\”字符替换为“/”字符,以适应 GNU 格式。
成功构建完成后,您将在 Cygwin 中看到以下消息
[x86] Prebuilt |
: libfmodex.so <= jni/../../../api/lib/x86/ |
[x86] Install |
: libfmodex.so => libs/x86/libfmodex.so |
[x86] Cygwin |
: Generating dependency file converter script |
[x86] Compile |
: main <= main.c |
[x86] SharedLibrary |
: libmain.so |
[x86] Install |
: libmain.so => libs/x86/libmain.so |
现在您的项目已构建,可以通过 Eclipse IDE 运行。
通过 Eclipse IDE 运行应用程序
要从 Eclipse IDE 启动应用程序,请按照以下步骤操作
- 启动 Eclipse 并单击 File > Import
- 选择 Existing Android… 选项,然后单击 Next
- 浏览到项目根目录,即
{$PROJECT DIRECTORY}
,然后确保未选中 Copy projects... 选项,然后单击 Finish - 您会注意到包资源管理器选项卡中导入的项目上有一个红色的感叹号,如下图所示。
- 要解决此问题,请单击 Window > Preferences,如前一页所示,将出现以下窗口。
- 单击 New… 选项,您将看到以下内容。
- 在“Name”字段中,键入
FMOD_LIB
- 然后单击 File 并浏览以找到以下文件
{$FMOD INSTALLED PATH}/api/lib/fmodex.jar
- 点击“确定”。
- 然后再次单击 OK,将出现以下窗口;单击 Yes
- 红色的感叹号错误将被解决。
- 然后单击 Project > Properties。
- 然后选择 C/C++ Build > Environment > Add
- 在 Name 字段中键入 ANDROID_NDK_ROOT,在 Value 字段中键入安装文件夹的完整路径。然后单击 OK
- 然后单击 Apply,再单击 OK
现在您可以启动应用程序了,但前提是您已将所有文件从两组示例媒体复制过来
{$FMOD INSTALLED PATH}\examples\media\* 和
{$FMOD INSTALLED PATH}\fmoddesignerapi\examples\media\*
复制到 SD 卡根目录下的一个名为 fmod
的文件夹。
注意:应用程序可能无法在模拟器中启动。
x86 平台特定设置
在构建专门针对 x86 平台的应用程序时,务必进行以下更改:(请注意,这些更改已包含在构建项目的过程中。)
- 转到
{$PROJECT DIRECTORY}\jni
目录并打开 Application.mk 文件(如果不存在则创建)。 - 更改以下代码
APP_ABI := armeabi armeabi-v7a
to
APP_ABI := x86
构建输出
构建的输出将位于 {$PROJECT DIRECTORY} 中,方式如下:
生成的库 libmain.so
和 libfmodex.so
将存在于 {$PROJECT DIRECTORY}\libs\x86 文件夹中。
生成的对象将位于 {$PROJECT DIRECTORY}\obj 文件夹中。
已知错误和问题
如果在通过 NDK 构建过程中出现错误,请将“Everyone”的访问权限设置为“完全控制”。
另请注意,应用程序可能无法在模拟器中启动,并且只有在复制了所有示例媒体后才能在设备上启动。
{$FMOD INSTALLED PATH}\examples\media\* 和
{$FMOD INSTALLED PATH}\fmoddesignerapi\examples\media\*
复制到 SD 卡根目录下的一个名为 fmod
的文件夹。
Cocos2D-x
现在,让我们通过 Cocos2d-x 游戏引擎,专门针对 x86 目标平台,来介绍构建跨平台 Android 应用程序的过程。
本文档中用于解释该过程的示例程序是 Cocos2d-x 游戏引擎的一部分,可以在 cocos2d-x-2.1.1 文件夹中的 \samples\Cpp\ 文件夹中找到。
Cocos2d-X 是一个用 C++ 编写的多平台端口,可与 iOS*、Android、Windows、Marmalade、Linux*、Bada 和 BlackBerry* 10 一起使用。此端口具有 Lua* 和 JavaScript* 作为脚本绑定。您可以在其网站上阅读 Cocos2d-X 支持文档。
在使用 Cocos2d-x 之前,请确保您已满足“先决条件”部分中详述的先决条件。
下载 Cocos2d-x
下载 Cocos2d-x 并选择最新版本。同时请记住选择简单的 Cocos2d-x 选项,而不是 –html5 选项。
安装和设置 Cocos2d-X 的步骤
- 将上一步下载的 zip 文件解压到您的 C:\ 驱动器。我将其解压到 D:\Cocos2d-x。
- Cocos2d-x 文件夹中应有两个文件夹。对我而言,它们是:D:\Cocos2d-x\__MACOSX 和 D:\Cocos2d-x\cocos2d-x-2.2.1。
- 按如下所示设置 Cocos2d-x 的环境变量
COCOS2DX_ROOT =
cocos2d-x-2.2.1
文件夹的完整路径,在我的情况下是:D:\Cocos2d-x\cocos2d-x-2.2.1
在开始之前,请注意几个变量,因为它们将在整个过程中广泛使用
{$ADT PATH}
= Android ADT bundle 的完整路径,在我的情况下是:D:\android\adt-bundle-windows-x86_64-20131030{$ECLIPSE PATH}
= 随 ADT Bundle 提供的 eclipse 的完整路径,对我而言是:{$ADT PATH}\eclipse
{$COCOS2D-X PATH}
= cocos2d-x-2.2.1 文件夹的完整路径,在我的情况下是:D:\Cocos2d-x\cocos2d-x-2.2.1{$WORKSPACE PATH}
= Eclipse Android 工作空间的完整路径,对我而言是:D:\and_proj_coco
在 Eclipse IDE 中配置 Cocos2d-x 项目
- 从以下路径运行 Eclipse:{$ECLIPSE PATH}\eclipse.exe
- 提示时创建您的工作空间。我将其创建在
{$WORKSPACE PATH}
,如下所示。 - 单击 File > Import,如下所示。
- 将出现一个窗口,如下所示。
- 展开 Android 部分。然后单击 Existing Android Code Into Workspace 选项,然后单击 Next,如上所示。
- 单击 Browse…,如下所示。
- 浏览到 {$COCOS2D-X PATH}\samples\Cpp\HelloCpp\proj.android,如下所示,然后单击 OK。
- 对于此示例项目,在单击 Finish 之前,请确保不要勾选 Copy projects into workspace 选项。
- 导入后,Eclipse 可能会显示一些错误。暂时忽略它们,然后继续进行下一步。
注意:将来,如果您不想干扰原始项目代码,并且确信将项目代码导入工作空间不会影响代码执行,那么您可以选中上述带圈的选项。
- 现在,重复步骤 c – h,区别在于,您将导入:{$COCOS2D-X PATH}\cocos2dx\platform\android,而不是导入 {$COCOS2D-X PATH}\samples\Cpp\HelloCpp\proj.android,如下所示,如果您愿意,可以选中 Copy project into workspace 选项。
- 如果在步骤 h 中遇到的错误此时仍未解决,请继续执行以下步骤。
- 现在,在左侧的 Package Explorer 选项卡中,右键单击 libcocos2dx,然后单击 Properties,如下图所示。
- 在出现的窗口中,单击左侧选项卡中的 Android 选项,并确保 Is Library 选项已选中,如下所示,然后单击 Apply,最后单击 OK。
- 同样,通过遵循步骤 j – k 来打开 HelloCpp 项目的 Properties 窗口。然后您将看到如下所示的窗口。
- 删除 Library 部分中标有红叉的任何内容,然后单击 Add。
- 选择 libcocos2dx,然后单击 OK,如下所示。
- 现在您将看到 Library 部分已填充绿色复选标记,如下所示,然后单击 Apply,再单击 OK。
- 此时,Eclipse 将重新构建项目。如果所有错误都已解决,则忽略此步骤。如果未解决,请从 Package Explorer 选项卡中删除现有的 HelloCpp 项目,并确保在删除时不要选择 Remove from disk,因为此操作不可撤销,然后重新执行步骤 c – h 和步骤 m – p。
- 现在,您的项目应该如下所示:
恭喜!您已成功在 Eclipse IDE 中打开了您的项目。现在让我们继续构建您的项目。
在 Eclipse IDE 中构建 Cocos2d-x 项目
- 从 Package Explorer 选项卡导航到 HelloCpp > jni > Application.mk,如下所示。
- 添加以下行以构建 x86 平台。
APP_ABI := x86
- 现在,从顶部菜单栏的 Project 选项卡中,先单击 Clean,然后单击 Build Project,如下所示。
通过 Cygwin 打开和构建 Cocos2d-x 项目
- 运行 Cygwin 并使用以下命令导航到 HelloCpp 示例项目文件夹。
cd /cygdrive/d/Cocos2d-x/cocos2d-x-2.2.1/samples/Cpp/HelloCpp/proj.android
请注意,路径取决于
{$COCOS2D-X PATH}
。 - 确保已将以下行添加到 /jni 文件夹中的 Application.mk 文件中。
APP_ABI := x86
- 要构建项目,请在 /proj.android 文件夹中,输入命令:
./build_native.sh
注意:如果发生任何错误,请确保
- Cygwin 的必需软件包已正确下载。
- Cygwin 的 PATH 变量包含 Android NDK、SDK、JDK 和 COCOS2D-X 文件夹的路径,如先决条件部分所述。
遵循并完成构建过程后,二进制文件将生成到以下文件夹:
proj.android\obj\local\x86
例如
proj.android\obj\local\x86\libhellocpp.so
proj.android\obj\local\x86\libcocos2d.a
OpenAL (Open Audio Library)
OpenAL (Open Audio Library) 是一个跨平台音频应用程序编程接口 (API)。它旨在高效渲染多声道、三维定位音频。其 API 风格和约定故意模仿 OpenGL。从 1.1 版本开始,Creative 公司已将其实现专有化。然而,OpenAL-Soft 是一个广泛使用的开源替代方案。我们将使用一个专门为 Android 适配的版本。
在开始处理 OpenAL 之前,请根据上面的先决条件部分进行下载。
下载 OpenAL 的修补源代码
要使用 OpenAL,您需要一个专门为 Android 适配的修补源代码。
感谢 Martins Mozeiko 和 Chris Robinson,现已有适配到 Android 平台的 OpenAL 版本。下载 修补过的 OpenAL 源代码 的最新版本。
或者,您也可以通过 Cygwin 终端下载此源代码。
- 运行 Cygwin 并输入以下命令:
git clone http://repo.or.cz/r/openal-soft/android.git OpenAL
- 现在存储库将克隆到当前目录下的一个名为 OpenAL 的文件夹中,对我而言是:/home/user001 或 ~。
注意:在 Cygwin 的 Windows 版本中,/home 文件夹位于安装 Cygwin 的目录中。在我的情况下,它是:D:\cygwin64
如何配置 x86 平台
在开始构建之前,创建一个普通的 Hello OpenAL Android 项目。让此项目文件夹的路径为 {$PROJECT_DIR},例如:D:\openal_proj\HelloOpenAL。
要使用 OpenAL for Android 进行编译,请按照以下步骤操作:
- 要编译 OpenAL,需要一个名为 config.h 的文件。从以下位置复制:
{$OPENAL_DIR}/android/jni
改为
{$OPENAL_DIR}/include
注意:此处,
{$OPENAL_DIR}
是从上一步下载的 OpenAL 目录的完整路径。对我而言,它是:~/openal
- 进行上述更改后,将此 OpenAL 文件夹复制到您的项目文件夹
{$PROJECT_DIR}
。 - 现在,在后续步骤中将原生接口添加到项目中。
- 我使用了 org_pielot_helloopenal_HelloOpenAL.c 文件来实现原生接口中的音频播放方法。
- 然后,我们需要创建两个 make 文件,Android.mk 和 Application.mk,并将它们与
.c
文件夹及其自定义.h
头文件一起放在jni
文件夹中。注意:这些文件的详细信息及其排列方式在文档末尾提供。
要专门为 x86 配置项目,请确保编辑以下文件以包含给定的相应值:
Application.mk
APP_OPTIM := release
APP_ABI := x86
如何构建项目
- 打开 Cygwin 并导航到
{$PROJECT_DIR}
cd /cygdrive/{$PROJECT_DIR}
其中
{$PROJECT_DIR}
是项目目录的完整路径。在我的情况下,它是cd /cygdrive/d/openal_proj
- 现在运行以下命令以将 NDK 文件夹的路径包含在 Cygwin PATH 环境变量中:
export PATH=.:/cygdrive/{$PATH TO NDK}:$PATH
例如,在我的情况下:
export PATH=.:/cygdrive/d/android/android-ndk-r9b:$PATH
- 运行命令
ndk-build
这将为 x86 目标架构构建您的 OpenAL 项目。
构建输出
构建的输出将位于 {$PROJECT_DIR}
。
生成的库 libopenal.so 和 libopenaltest.so 将位于 {$PROJECT_DIR}\libs\x86 文件夹中。
生成的对象将位于 {$PROJECT_DIR}\obj 文件夹中。
OpenSSL* 库
以下过程描述了如何在 x86 上为 Android 构建 OpenSSL 库。
必备组件
- 运行 Windows 7 或更高版本的宿主 PC。
- 由于 OpenSSL 库是用原生 C 语言开发的,因此编译的主要先决条件是 Android NDK,它内置了对为特定架构(ARM、x86 等)交叉编译库的支持。
Android OpenSSL 源代码可以从 github 上的 eighthave 项目 或 guardian 项目 下载。
为 x86 构建
与构建任何其他 Android 应用程序一样,可以使用 Application Binary Interface 设置进行跨平台设置。
应将以下行添加到 jni/Application.mk 文件中,以构建 x86 架构的库。
APP_ABI := x86
安装并解压 Android OpenSSL 到本地磁盘驱动器(例如,C:\openssl-android-master)后,请按照以下说明为 x86 构建库:
- 打开命令提示符(Start->All Programs->Accessories->Command Prompt)。
- 移动到您下载并解压的 OpenSSL Android 文件夹,例如:
>cd C:\openssl-android-master。 - 务必设置 x86 所需的配置设置,例如,APP_ABI := x86。
- 发出 NDK 构建命令,例如,C:\openssl-android-master > ndk-build。
这将构建 libssl、libcrypto、openssl 库。
生成的库可以在以下位置找到:
C:\openssl-android-master\libs\x86\libcrypto.so
C:\openssl-android-master\libs\x86\libssl.so
关于作者
Praveen Kundurthy 在 Intel® Software and Services Group 工作。他拥有计算机工程硕士学位。他的主要兴趣是移动技术、Windows 和游戏开发。