使用英特尔编译器编译Android程序 (Windows开发平台为例)

介绍

针对Android*的Intel(R) C++ 编译器(以下称为ICC Android),和Android NDK*中的GCC*编译器兼容,能用于开发基于x86的Android设备上的应用程序。开发机器可以使用Windows*,OS X*或者Linux*。使用Android版本的Intel C++编译器,需要Android NDK。ICC Android的主要优势是提供杰出的应用程序性能(说明:针对C/C++等本地代码,针对x86设备)。本文以Windows*开发平台为例,其它平台使用类似。

安装

ICC Android由Intel® INDEIntel® System Studio产品提供,下载安装包后安装即可。安装完成后,根据提示,ICC Android会自动集成到NDK中,并且,ICC会成为默认的Android x86编译器。

在Android NDK编译系统中,使用ICC工具链:编译一个示例程序

对于使用NDK开发应用程序的程序员来说,切换到ICC Android编译器非常简单。下面是关于如何编译NDK自带的hello-jni程序的过程。

hello-jni工程的代码在:<NDK安装路径>\samples\hello-jni\jni\中。下面文中使用%NDK_DIR%表示NDK安装路径。

方式一:使用命令行选项

打开cmd.exe,进入hello-jni工程的jni目录(cd %NDK_DIR%\samples\hello-jni\jni),执行下面的命令编译:

%NDK_DIR%\ndk-build APP_ABI=x86 NDK_TOOLCHAIN=x86-icc -B

其中,APP_ABI的含义是编译目标为x86(可以参考NDK文档理解),NDK_TOOLCHAIN变量是NDK文档中没有介绍的变量,这个变量用于切换编译器,在安装了ICC Android编译器并集成到NDK中后,就可以使用NDK_TOOLCHAIN=x86-icc来切换了。-B选项表示强制重新编译。

如何切换回gcc编译器?

前面提到,安装ICC后,ICC Android会成为x86的默认编译器,所以使用"ndk-build APP_ABI=x86 -B"也会调用ICC编译器。那么,如果你需要切换回NDK自带的GCC编译器,可以使用选项“NDK_TOOLCHAIN=x86-<gcc version>” (其中<gcc version>为你所使用的NDK自带的GCC的版本,不同版本的NDK提供的GCC版本会发生变化,比如对于ndk-r10b来说,其提供了4.6和4.8),所以可以使用NDK_TOOLCHAIN=x86-4.8切换为GCC 4.8编译)。

%NDK_DIR%\ndk-build APP_ABI=x86 NDK_TOOLCHAIN=x86-4.8 -B

说明:可以使用ndk-build的选项V=1查看log,其中会显示所使用的编译器,更多ndk-build的选项请参考NDK文档。

方式二:使用Application.mk

了解NDK就知道,NDK的一些选项不仅仅可以通过命令行指定,也可以通过Application.mk来指定。可以在你的工程的Application.mk(如果没有,就创建一个)中添加如下上述设置:

APP_ABI := x86
NDK_TOOLCHAIN := x86-icc

比如hello-jni,可以在jni目录中修改Application.mk即可。设置后,就可以使用ndk-build编译了,比如:

%NDK_DIR%\ndk-build APP_ABI=x86 -B V=1

说明:方式一和方式二本质上是一样的,关键点是要了解NDK_TOOLCHAIN变量,该变量在NDK的文档中可能没有提及。其它选项,参考NDK文档理解即可。比如,如果你需要设置ICC Android编译器的优化选项,那么可以使用Application.mk中的APP_CFLAGS (如APP_CFLAGS="-xATOM_SSSE3 -O3 -ipo"),也可以在命令行使用APP_CFLAGS选项。

在Eclipse中使用NDK,并且使用ICC Android编译器

如果了解Eclipse中使用NDK的方法,那么,对于使用ICC Android编译器也不是问题了。因为,Eclipse不过是自动调用ndk-build脚本而已,所以,仍然只需要在工程的Application.mk中设置如上的选项,那么,自然,Eclipse中也可以使用ICC Android了。

将ICC Android作为独立工具链使用

我们知道,在NDK中,有一个脚本用于提取一个独立工具链,提取的独立工具链,就可以用于类似于Linux*的方式来编译了,比如"gcc xxx.c....",这样的好处是,对于某些基于一般的makefile的方式的项目,很容易的移植到Android平台。NDK中创建独立工具链的脚本在:

<NDK安装路径>\build\tools\make-standalone-toolchain.sh,运行该脚本就可以创建独立工具链,当然,只能在Linux、OS X或Cygwin等下运行该脚本。

对于ICC Android,使用该脚本无法提取工具链,ICC Android提供了更直接的方法,它本身就是一个独立工具链。

打开一个cmd.exe窗口,调用<inde-install-dir>\icc_android\bin\compilervars.bat ia32脚本,就可以正确的设置ICC独立工具链的环境。其中<inde-install-dir>为INDE的安装目录,默认为:C:\Intel\INDE。使用独立工具链的方法,就是直接调用icc命令(类似于gcc命令),并且添加适当的选项即可。如,下面是将hello-jni的NDK源码,编译为动态库的过程:

这样,就能得到libhello-jni.so动态库了。

说明:以上为英特尔的Android编译器的基本使用,关于英特尔编译器的优化选项和优化技术,可以参考其文档:https://software.intel.com/en-us/compiler_15.0_ug_c

 

This article applies to:
Products: Intel(R) INDE; INTEL(R) System Studio
Host OS/platforms: Windows (IA-32, Intel(R) 64), Linux* (IA32, Intel(R) 64)
Target OS/platforms: Android* (IA-32)

For more complete information about compiler optimizations, see our Optimization Notice.