构建跨平台Android应用的指南

在Android平台上,存在多种处理器架构,例如支持ARM或x86指令集架构的处理器。不同的指令集架构之间并不兼容,因此,如果应用包含原生代码,那么它应该为每个目标架构提供原生库。本文将介绍如何构建包含ISA独立dex文件以及针对不同ISA目标的库的'fat' APK。

准备构建环境

为了构建支持ARM和x86架构的Android设备的应用,需要安装以下工具,并按照以下顺序进行操作:

安装:

  • Microsoft .NET Framework
  • Java Development Kit 7u67

假设JDK安装在[jdk7-dir]目录下,需要将该目录添加到"PATH"环境变量中。对于Windows环境,确保使用短文件夹名,例如将"Program Files (x86)"替换为"PROGRA~2"。

创建一个新的环境变量"JAVA_HOME=[jdk7-dir]"。

安装:

  • Intel Integrated Native Developer Experience

假设安装在[inde-dir]目录下,需要将该目录添加到"PATH"环境变量中。默认的[ant-dir]位置是[inde-dir]\IDEintegration。

从命令行构建

本节提供了如何从命令行构建环境创建支持ARM和x86架构的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

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

使用以下命令为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。

使用以下命令使用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:使用Android的Intel C/C++编译器覆盖默认的gcc 4.6。NDK_APP.local.cleaned_binaries=true:禁止在libs/armeabi目录中删除库。

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

准备应用包(APK)

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

为了简化包的创建并避免包签名,使用以下命令创建调试包:

$ ant debug

之后,新的HelloJni-debug.apk包可以在.\bin目录中找到。它可以在支持API级别19或更高版本的x86*或ARM*模拟器上运行,这些模拟器由Android SDK提供。

HelloJni-debug.apk包包含两个目标的库:ARM EABI v7a和x86。

从Eclipse* IDE构建

打开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。

向项目添加Native Support:

  • 右键单击项目名称,然后选择Android Tools > Add Native Support...
  • 点击Finish。

注意:如果在这一步之后看到控制台错误"Unable to launch cygpath",可以忽略,它不会影响项目。

为每个目标平台创建单独的构建配置,并设置构建命令:

  • 右键单击项目,然后选择Properties -> C/C++ Build -> "Manage configurations..."
  • 点击New...添加以下新配置,基于Default配置:

名称:x86_icc,描述:针对x86目标使用Intel编译器icc。

名称:arm_gcc,描述:针对ARM目标使用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。

清理整个应用工作区:

  • 如果[eclipse-workspace-dir]\HelloJni\jni目录下存在Application.mk,请确保它没有以下行:
NDK_APP.local.cleaned_binaries=true

右键单击项目,然后选择Build configurations > Clean all…

创建Application.mk:

  • 如果[eclipse-workspace-dir]\HelloJni\jni目录下不存在Application.mk,请创建它,并确保它包含以下行:
NDK_APP.local.cleaned_binaries=true

使用gcc为ARM*目标构建应用二进制文件,使用Intel编译器为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

创建未签名的应用包:

  • 右键单击项目,然后选择Android Tools > Export Unsigned Application Package...
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485