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

使用Intel®编译器和GNU* gcc创建x86和ARM* APK

2015年2月12日

CPOL

6分钟阅读

viewsIcon

20298

本文提供了有关构建此类“fat”apk 的分步说明,该 apk 包含用于 Dalvik* 虚拟机(Dalvik,2013)的 ISA 独立 dex 文件以及用于不同 ISA 目标的库。

Intel® Developer Zone 提供用于跨平台应用开发、平台和技术信息、代码示例以及同行专业知识的工具和操作指南,以帮助开发人员创新和取得成功。加入我们的 Android物联网Intel® RealSense™ 技术Windows 社区,下载工具,访问开发套件,与志同道合的开发人员分享想法,并参加黑客马拉松、竞赛、路演和本地活动。

目录

  1. 引言
  2. 准备构建环境
  3. 从命令行构建
    1. 配置应用程序
    2. 清理应用程序工作区
    3. 为 ARM* 架构构建二进制文件
    4. 为 x86 架构构建二进制文件
    5. 准备应用程序包 (APK)
  4. 从 Eclipse* IDE 构建
  5. 关于避免清理 .\libs\[targetabi] 下的二进制文件的说明
  6. 其他相关文章和资源

引言

存在运行在支持 ARM* 或 x86 指令集架构 (ISA) 的处理器上的 Android* 设备。不同的 ISA 不是二进制兼容的,因此如果应用程序包含本机代码,则应为每个目标 ISA 提供本机库。“fat”Android* 应用程序包(“fat”APK)是此类应用程序的一种分发机制。

本文提供了有关构建此类“fat”apk 的分步说明,该 apk 包含用于 Dalvik* 虚拟机(Dalvik,2013)的 ISA 独立 dex 文件以及用于不同 ISA 目标的库。它包括使用 Intel® Integrated Native Developer Experience (INDE) 为 x86 构建本机应用程序库

我们将使用 NDK r10 发行版中的 hello-jni 示例进行演示(该示例随 Intel® INDE 安装程序提供)。

准备构建环境

以下工具是必需的,应按顺序遵循这些说明

  1. Install
  2. 将此目录添加到“PATH”环境变量
    • 目录 "[jdk7-dir]\jre\bin" 用于使用 "java" VM。这对于 "ant" 工具是必需的
      对于 Windows 环境,请确保使用短文件夹名称,例如 "PROGRA~2" 代替 "program files (x86)"
  3. 创建一个新的环境变量
    • "JAVA_HOME=[jdk7-dir]"
  4. Install
  5. 将此目录添加到“PATH”环境变量
    • 目录 "[ant-dir]\bin" 用于使用 "ant" 工具([ant-dir] 的默认位置是:[inde-dir]\IDEintegration

从命令行构建

本节提供有关如何从命令行构建环境为支持 ARM* 和 x86 架构的 Android 设备创建 APK 包的说明。

首先,在 Linux* 上打开命令窗口或终端窗口;转到 Android NDK 示例 "hello-jni" 目录 [ndk-dir]\samples\hello-jni;然后按照以下步骤操作。

注意:上面一节中提到的所有工具都应从此窗口访问。

  1. 配置应用程序

    从 "hello-jni" 目录运行以下命令以生成将在以后用于构建示例的 build.xml 文件。

    $ android update project --target android-19 --name HelloJni --path . --subprojects

    注意
    --target android-19:对应于 Android 4.4 (KITKAT) 版本。

  2. 清理应用程序工作区

    使用以下命令清理整个工作区,包括所有 ISA 架构的库。
    $ ant clean
    $ ndk-build V=1 APP_ABI=all clean

    注意
    . V=1:打印正在执行的所有命令。
    . APP_ABI=all:强制清理所有目标的中介文件。如果省略此参数,则只清理 armeabi 目标。

  3. 为 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

  4. 使用 Intel 编译器为 x86 架构构建二进制文件

    使用以下命令使用 Intel 编译器为 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++ 编译器替换 Android 的默认编译器 gcc 4.6。
    . NDK_APP.local.cleaned_binaries=true:抑制 libs/armeabi 目录中库的删除。请参阅底部的说明

    应用程序二进制文件(libhello-jni.so )创建在 .\libs\x86\libhello-jni.so

  5. 准备应用程序包 (APK)

    为每个 Android 目标构建完所有二进制文件后,请检查 libs\[targetabi] 目录是否包含每个目标架构所需的库。

    为了简化包创建并避免包签名,请使用以下命令创建调试包
    $ ant debug

    之后,新的 HelloJni-debug.apk 包可以在 .\bin 目录中找到。它可以运行在支持 Android SDK 提供的 API 级别 19 或更高版本的 x86* 或 ARM* 模拟器上。
    HelloJni-debug.apk 包包含 2 个目标的库:ARM EABI v7a 和 x86。

从 Eclipse* IDE 构建

  1. 打开 Eclipse 并加载示例 [inde-dir]/IDEintegration/NDK/samples/hello-jni
    • 选择菜单 File > New > Project > Android
    • 选择 Android Project from Existing Code 按钮
    • Root Directory 字段中,点击 Browse... 并选择 [ndk-dir]/samples 目录。
    • 然后点击 Deselect All 并仅选择项目:hello-jni
    • 勾选 Copy projects into workspace 复选框
    • 点击 Finish
  2. 向项目添加 Native Support
    • 右键单击项目名称并选择 Android Tools > Add Native Support...
    • 点击 Finish
    注意:如果您在此步骤后在控制台中看到错误“Unable to launch cygpath”,则可以忽略此错误,它不会影响您的项目。
  3. 为每个目标平台创建单独的构建配置并设置构建命令
    右键单击项目并选择 Properties -> C/C++ Build -> "Manage configurations..."
    点击 New... 以基于 Default 配置添加以下新配置
    • Name: x86_icc Description: For x86 target using Intel Compiler icc
    • Name: arm_gcc Description: For ARM target using GNU gcc
    仍在同一项目属性窗口中,将 Configuration 设置为 "x86_icc"
    • 取消勾选 "Use default build command"
    • Build command 字段中添加以下内容
      ndk-build APP_ABI=x86 NDK_TOOLCHAIN=x86-icc
    • 点击 Apply
    在同一项目属性窗口中,将 Configuration 设置为 "arm_gcc"
    • 取消勾选 "Use default build command"
    • Build command 字段中添加以下内容
      ndk-build APP_ABI=armeabi-v7a NDK_TOOLCHAIN=arm-linux-androideabi-4.8
    • 点击 Apply ,然后点击 OK
  4. 清理整个应用程序工作区
    • 如果 Application.mk 存在于 [eclipse-workspace-dir]\HelloJni\jni 目录下,请确保它 **不** 包含以下行
      NDK_APP.local.cleaned_binaries=true
    • 右键单击项目并选择 Build configurations > Clean all…
  5. 如果在 [eclipse-workspace-dir]\HelloJni\jni 目录下不存在 Application.mk ,请创建它,并确保它 **包含** 以下行
    NDK_APP.local.cleaned_binaries=true
  6. 使用 gcc 为 ARM* 目标构建应用程序二进制文件,使用 Intel Compiler 为 x86 目标构建。
    • 右键单击项目并选择 Build Configurations > Build Selected...
    • 选择 "arm_gcc" 和 "x86_icc"
    • 点击 Ok
    • 验证输出二进制文件在
      • [eclipse-workspace-dir]\HelloJni\libs\armeabi-v7a\libhello-jni.so
      • [eclipse-workspace-dir]\HelloJni\libs\x86\libhello-jni.so
  7. 创建未签名的应用程序包
    右键单击项目并选择 Android Tools > Export Unsigned Application Package...

关于避免清理 .\libs\[targetabi] 下的二进制文件的说明

使用 NDK_APP.local.cleaned_binaries=true 参数来抑制先前构建的库的删除,在未来的 NDK 版本中可能会失效。请查阅 [ndk-dir]/build/core/setup-app.mk makefile,了解如何禁用 clean-installed-binaries 目标的可删除操作。

其他相关文章和资源

要了解有关 Intel Android 开发工具的更多信息,请访问 Intel® Developer Zone for Android

© . All rights reserved.