使用英特尔® 编译器和 GNU* gcc 创建 x86 和 ARM* APK
来源:互联网 发布:淘宝小号怎么注册 编辑:程序博客网 时间:2024/06/05 22:46
目录
- 介绍
- 准备构建环境
- 从命令行构建
- 配置应用
- 清除应用工作区
- 构建面向 ARM* 架构的二进制
- 构建面向 x86 架构的二进制
- 准备应用包(APK)
- 从 Eclipse* IDE 构建
- 注意不要清除
.\libs\[targetabi]
下的二进制 - Other 其它相关文章与资源
Introduction
有一些 Android* 设备的处理器支持 ARM* 或 x86 指令集架构(ISA)。不同 ISA 的二进制不相互兼容,因此,如果应用包含原生代码,则需要为对应 ISA 提供原生 库。“胖”Android* 应用包(“胖”APK)是此类应用的发布机制之一。
本文逐步详细介绍如何构建此类“胖”apk,它包括面向 Dalvik* 虚拟机(Dalvik,2013) 、ISA 独立的 dex 文件,以及面向不同 ISA 目标的库。它还包括使用英特尔® Integrated Native Developer Experience (INDE) 构建面向 x86 的原生应用库。
我们将演示来自 NDK r10 发布的 hello-jni 示例(随英特尔® INDE 安装提供)。
准备构建环境
需要使用下面的工具,并按照顺序进行操作:
- 安装:
- Microsoft* .NET 框架
- Java* 开发套件 7u67 假设安装在
[jdk7-dir]
- 将该目录添加至“PATH”环境变量:
- 添加目录 "
[jdk7-dir]\jre\bin
" 以便使用 "java
" 虚拟机。这是 "ant
" 工具的必要条件
对于 Windows 环境,务必使用文件夹的简名,例如使用 "PROGRA~2
" 代替 "program files (x86)
"
- 创建新的 env-var:
- 安装:
- 英特尔® Integrated Native Developer Experience 假设安装在
[inde-dir]
- 将该目录添加至“PATH”环境变量:
- 添加目录"
[ant-dir]\bin
"以便使用 "ant
" 工具( [ant-dir]
的默认位置为:[inde-dir]\IDEintegration
)
从命令行构建
本节介绍如何从命令行环境构建支持基于 ARM* 和 x86 架构的 Android 设备的 APK 包。
首先打开 Linux* 上的命令窗口或终端窗口;定位至 Android NDK 示例 "hello-jni
" 目录 [ndk-dir]\samples\hello-jni
;然后执行以下步骤。
注:上文所述的所有工具均可从该窗口访问。
配置应用
从"hello-jni
" 目录运行以下命令,生成一个build.xml
文件,供下面构建示例时使用。 $ android update project --target android-19 --name HelloJni --path .--subprojects
注:
--target android-19
: 对应 Android 4.4 (KITKAT) 版。
清除应用工作区
使用以下命令清除整个工作区,包括面向所有 ISA 架构的库。
$ ant clean
$ ndk-build V=1 APP_ABI=all clean
Note:
.V=1
: 显示所有正在执行的命令。
.APP_ABI=all
: 强制清除所有目标的中间文件。如果省略该参数,则仅清除 armeabi
目标。
构建面向 ARM* 架构的二进制
使用以下命令构建面向 ARM 架构的应用二进制:
$ ndk-build APP_ABI=armeabi-v7a V=1 NDK_TOOLCHAIN=arm-linux-androideabi-4.8
注:
.APP_ABI=armeabi-v7a
: 为 ARM* 目标配置编译。
.NDK_TOOLCHAIN=arm-linux-androideabi-4.8
: 将默认的 GNU* gcc 4.6 更改为 gcc 4.8。应用二进制 (libhello-jni.so
) 的创建目录是.\libs\armeabi-v7a\libhello-jni.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
:借助 Intel C/C++ compiler for Android 更改默认的编译器 gcc 4.6。
.NDK_APP.local.cleaned_binaries=true
: 在 libs/armeabi 目录中禁止库移除。请看结尾注释。应用二进制(libhello-jni.so
)的创建目录是.\libs\x86\libhello-jni.so
准备应用包 (APK)
每个安卓目标的二进制构建以后,请检查libs\[targetabi]
目录中是否包含每个目标架构所需的库。
为了简化包的创建以及避免包的签名,请使用以下命令创建一个调试包:
$ ant debug
然后,新的HelloJni-debug.apk
包就会出现在.\bin
目录中。它可运行于支持由安卓软件开发套件(SDK)提供的 19 级以上的 API 的 x86* 或 ARM* 架构模拟器。
HelloJni-debug.apk
包提供面向两个目标的库:ARM EABI v7a 和 x86。
从 Eclipse* IDE 构建
- 打开 Eclipse 并加载示例
[inde-dir]/IDEintegration/NDK/samples/hello-jni
- 选择菜单
文件>新建>项目>安卓项目
- 选择
现有代码提供的安卓项目
按钮 - 在
根目录
字段中,点击浏览...
然后选择[ndk-dir]/samples
目录。 - 点击
取消所有选择
,只选择该项目:hello-jni
- 选中 says
将项目复制到工作区
- 点击
完成
。
- 将
原生支持
添加至项目:- 右击项目名称并选择
安卓工具 > 添加原生支持...
- 点击
完成
。
注:如果执行此操作后,控制台发生错误 "Unable to launch cygpath",请予以忽略,它不会对您的项目产生影响。 - 为每个目标平台创建独立的构建配置并设置构建命令
右击项目并选择属性 -> C/C++ Build -> "管理配置..."
点击新建...
添加下面基于默认
配置的新配置:- Name:
x86_icc
Description:For x86 target using Intel Compiler icc
- Name:
arm_gcc
Description:For ARM target using GNU gcc
继续在同一“项目属性”窗口中,将配置
设置为"x86_icc":- 取消“使用默认构建命令”
- 将以下语句添加至
构建命令
字段:
ndk-build APP_ABI=x86 NDK_TOOLCHAIN=x86-icc
- 点击
应用
再次在同一“项目属性”窗口中,将配置
设置为"arm_gcc":- 取消“使用默认构建命令”
- 将以下语句添加至
构建命令
字段:
ndk-build APP_ABI=armeabi-v7a NDK_TOOLCHAIN=arm-linux-androideabi-4.8
- 点击
应用
,然后点击确定
- 清除整个应用工作区
- 如果
Application.mk
出现在 [eclipse-workspace-dir]\HelloJni\jni
目录中,请确保它不包含以下行:
NDK_APP.local.cleaned_binaries=true
- 右击项目并选择
构建配置 > 清除全部…
- 在
[eclipse-workspace-dir]\HelloJni\jni
目录下创建 Application.mk
(如果不存在),并确保它不包含以下行:
NDK_APP.local.cleaned_binaries=true
- 使用 gcc 构建面向 ARM* 目标的应用二进制,使用英特尔编译器构建面向 x86 目标的应用二进制。
- 右击项目并选择
构建配置 > 构建选择...
- 选择“arm_gcc” 和 “x86_icc”
- Click
Ok
. - 验证输出二进制文件的路径是:
-
[eclipse-workspace-dir]\HelloJni\libs\armeabi-v7a\libhello-jni.so
[eclipse-workspace-dir]\HelloJni\libs\x86\libhello-jni.so
- 创建未签名的应用包
右击项目并选择安卓工具 > 导出未签名的应用包...
注意不要清除二进制.\libs\[targetabi]
在未来 NDK 版本中可能无法使用NDK_APP.local.cleaned_binaries=true
参数禁止移除之前构建的库。请参考[ndk-dir]/build/core/setup-app.mk
mmakefile 了解如何禁用目标 clean-installed-binaries 的删除操作。
0 0