目录
介绍
有一些 Android* 设备的处理器支持 ARM* 或 x86 指令集架构(ISA)。 不同 ISA 的二进制不相互兼容,因此,如果应用包含原生代码,则需要为对应 ISA 提供原生库。 “变胖”Android* 应用包(“变胖”APK)是此类应用的发布机制之一。
本文逐步详细介绍如何构建此类“变胖”apk,它包括面向 Dalvik* 虚拟机(Dalvik,2013) 、ISA 独立的 dex 文件,以及面向不同 ISA 的库。 它还包括使用英特尔® C++ Compiler for Android*构建面向 x86 的原生应用库。
我们将演示来自 NDK r9 发布的 hello-gl2 示例。
准备构建环境
需要安装以下工具:
- Android* SDK 包(2013)一般安装在
[android-sdk-dir]
- Android* 原生开发套件(Android NDK 2013)一般安装在
[ndk-dir]
- Java* 开发套件 6一般安装在
[jdk6-dir]
- Apache* Ant*工具 版本 1.8 一般安装在
[ant-dir]
- 英特尔® C++ Compiler for Android*一般安装在
[icc-dir]
这一工具应最后安装。
将必要目录添加至“PATH”环境变量:
- 添加目录“
[ndk-dir]
”以便使用“ndk-build
”工具 - 添加目录“
[android-sdk-dir]\sdk\tools
”以便使用“android
”工具 - 添加目录“
[ant-dir]\bin
”以便使用“ant
”工具 - 添加目录“
[jdk6-dir]\jre\bin
”以便使用“java
”虚拟机。 这是“ant
”工具的必要条件
对于 Windows 环境,务必使用文件夹的简名,例如,使用“PROGRA~2
”代替“program files (x86)
” - 创建新的环境变量“
JAVA_HOME=[jdk6-dir]
”
从命令行构建
本节介绍如何从命令行环境构建支持基于 ARM* 和 x86 架构的 Android 设备的 APK 包。
首先打开 Linux* 上的命令窗口或终端窗口;定位至 Android NDK 示例“hello-gl2
”目录[ndk-dir]\samples\hello-gl2
;然后执行以下步骤。
注意: 上文所述的所有工具均可从该窗口访问。
配置应用
从“hello-gl2
”目录运行以下命令,生成一个build.xml
文件,供下面构建示例时使用。$ android update project --target android-18 --name HelloGL2 --path . --subprojects
--target android-18
: 对应 Jelly Beans MR2 Android 版本。清除应用工作区
使用以下命令清除整个工作区,包括面向所有 ISA 架构的库。
$ ant clean
$ ndk-build V=1 APP_ABI=all clean
. V=1
: 显示所有正在执行的命令。
. APP_ABI=all
: 强制清除所有目标的中间文件。 如果省略该参数,则仅清除armeabi
目标。构建面向 ARM* 架构的二进制
使用以下命令构建面向 ARM 架构的应用二进制:
$ ndk-build APP_ABI=armeabi V=1 NDK_TOOLCHAIN=arm-linux-androideabi-4.8
. APP_ABI=armeabi
: 为 ARM* 目标配置编译。
. NDK_TOOLCHAIN=arm-linux-androideabi-4.8
: 将默认的 GNU* gcc 4.6 更改为 gcc 4.8。应用二进制(
libgl2jni.so
)的创建目录是.\libs\armeabi\libgl2jni.so
使用英特尔编译器构建面向 x86 架构的二进制
使用以下命令和英特尔编译器构建面向 x86 架构的应用二进制:
$ ndk-build APP_ABI=x86 V=1 NDK_TOOLCHAIN=x86-icc NDK_APP.local.cleaned_binaries=true
. APP_ABI=x86
: 为 x86 架构配置编译。
. NDK_TOOLCHAIN=x86-icc
: 将默认的编译器 gcc 4.6 更改为英特尔 C/C++ compiler for Android。
. NDK_APP.local.cleaned_binaries=true
: 在 libs/armeabi 目录中禁止库移除。 请看结尾注释。应用二进制(
libgl2jni.so
)的创建目录是.\libs\x86\libgl2jni.so
准备应用包(APK)
每个安卓目标的二进制构建以后,请检查
libs\[targetabi]
目录中是否包含每个目标架构所需的库。为了简化包的创建以及避免包的签名,请使用以下命令创建一个调试包:
$ ant debug
然后,新的
HelloGL2-debug.zip
包就会出现在.\bin
目录中。 它可运行于支持由安卓软件开发套件(SDK)提供的 18 级以上的 API 的 x86* 或 ARM* 架构模拟器。HelloGL2-debug.zip
包提供面向两个目标的库: ARM EABI 和 x86。
从 Eclipse* IDE 构建
- 打开 Eclipse 并加载示例
[ndk-dir]/samples/hello-gl2
- 选择菜单
文件>新建>项目>安卓项目……
- 选择按钮
现有代码提供的安卓项目
- 选择 Android 1.5 以上的 API 级别
- 在
根目录
字段中,点击浏览……
然后选择[ndk-dir]/samples/hello-gl2
目录。 - 点击
完成
。
- 选择菜单
- 将
原生支持
添加至项目:
右击项目名称并选择安卓工具>添加原生支持……
- 为每个目标平台创建独立的构建配置并设置构建命令
右击项目并选择项目属性 -> C/C++ 构建程序 -> “管理配置……”
点击新建
将以下命令添加至新建配置,基于默认
配置:"x86_icc" for x86 target using Intel Compiler icc
"amr_gcc" for ARM target using GNU gcc
配置
到“x86_icc”:- 取消“使用默认构建命令”
- 将以下语句添加至
构建命令
字段:ndk-build APP_ABI=x86 NDK_TOOLCHAIN=x86-icc
配置
到“arm_gcc”:- 取消“使用默认构建命令”
- 将以下语句添加至
构建命令
字段:ndk-build APP_ABI=armeabi NDK_TOOLCHAIN=arm-linux-androideabi-4.8
- 点击
确定
- 清除整个应用工作区
右击项目并选择构建配置 > 清除全部……
注: 如果
Application.mk
出现在jni
目录中,请确保它不包含以下行:NDK_APP.local.cleaned_binaries=true
- 使用 gcc 构建面向 ARM* 目标的应用二进制
- 创建
Application.mk
于jni
目录中并添加以下行:NDK_APP.local.cleaned_binaries=true
- 右击项目并选择
构建配置 > 激活 > arm_gcc
- 右击项目并选择
构建项目
- 验证输出二进制文件的路径是
[eclipse-workspace-dir]\GL2JNIActivity\libs\armeabi\libgl2jni.so
- 创建
- 使用英特尔编译器构建面向 x86 的应用二进制
- 右击项目并选择
构建配置 > 激活 > x86_icc
- 右击项目并选择
构建项目
- 验证输出二进制文件的路径是
[eclipse-workspace-dir]\GL2JNIActivity\libs\x86\libgl2jni.so
- 右击项目并选择
- 为配置的所有目标构建所有应用二进制
- 创建
Application.mk
于jni
目录中并添加以下行:NDK_APP.local.cleaned_binaries=true
- 右击项目并选择
构建配置 > 构建所有……
- 验证输出二进制文件的路径是:
[eclipse-workspace-dir]\GL2JNIActivity\libs\armeabi\libgl2jni.so
[eclipse-workspace-dir]\GL2JNIActivity\libs\x86\libgl2jni.so
- 创建
- 创建未签名的应用包
右击项目并选择安卓工具 > 导出未签名的应用包……
注意不要清除二进制.\libs\[targetabi]
在未来 NDK 版本中可能无法使用 NDK_APP.local.cleaned_binaries=true
参数禁止移除之前构建的库。 请参考 [ndk-dir]/build/core/setup-app.mk
makefile 了解如何禁用目标 clean-installed-binaries 的删除操作。
其它相关文章与资源
- NDK Android* 应用移植方法
- 将默认编译器从英特尔 C++ Compiler 更改为 GCC for x86
- 英特尔® C++ Compiler for Mac OS* - 兼容 GNU* gcc 和 g++ 编译器
- 面向英特尔® 架构的 Android* NDK
- 加速英特尔® 架构上的 Android* 模拟器
如需深入了解面向安卓开发人员的英特尔工具,请访问:面向安卓的英特尔® 开发人员专区。