在Android平台上,存在多种处理器架构,例如支持ARM或x86指令集架构的处理器。不同的指令集架构之间并不兼容,因此,如果应用包含原生代码,那么它应该为每个目标架构提供原生库。本文将介绍如何构建包含ISA独立dex文件以及针对不同ISA目标的库的'fat' APK。
为了构建支持ARM和x86架构的Android设备的应用,需要安装以下工具,并按照以下顺序进行操作:
安装:
假设JDK安装在[jdk7-dir]目录下,需要将该目录添加到"PATH"环境变量中。对于Windows环境,确保使用短文件夹名,例如将"Program Files (x86)"替换为"PROGRA~2"。
创建一个新的环境变量"JAVA_HOME=[jdk7-dir]"。
安装:
假设安装在[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。
在为每个Android目标构建了所有二进制文件之后,请检查libs\[targetabi]目录是否包含每个目标架构所需的库。
为了简化包的创建并避免包签名,使用以下命令创建调试包:
$ ant debug
之后,新的HelloJni-debug.apk包可以在.\bin目录中找到。它可以在支持API级别19或更高版本的x86*或ARM*模拟器上运行,这些模拟器由Android SDK提供。
HelloJni-debug.apk包包含两个目标的库:ARM EABI v7a和x86。
打开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:
注意:如果在这一步之后看到控制台错误"Unable to launch cygpath",可以忽略,它不会影响项目。
为每个目标平台创建单独的构建配置,并设置构建命令:
名称:x86_icc,描述:针对x86目标使用Intel编译器icc。
名称:arm_gcc,描述:针对ARM目标使用GNU gcc。
在相同的项目属性窗口中,将Configuration设置为"x86_icc":
ndk-build APP_ABI=x86 NDK_TOOLCHAIN=x86-icc
点击Apply,然后在相同的项目属性窗口中,将Configuration设置为"arm_gcc":
ndk-build APP_ABI=armeabi-v7a NDK_TOOLCHAIN=arm-linux-androideabi-4.8
点击Apply,然后点击OK。
清理整个应用工作区:
NDK_APP.local.cleaned_binaries=true
右键单击项目,然后选择Build configurations > Clean all…
创建Application.mk:
NDK_APP.local.cleaned_binaries=true
使用gcc为ARM*目标构建应用二进制文件,使用Intel编译器为x86目标构建。
验证输出二进制文件:
创建未签名的应用包: