使用ARMCC编译Android本机库

时间:2013-06-23 16:27:17

标签: android android-ndk arm armcc

我一直在研究一个拥有多个原生C ++库的Android项目。使用带有ADT插件的Eclipse进行编译和调试效果很好。显然,Android NDK使用某些版本的arm-linux-gnueabi-gcc来编译本机库。

由于我一直在大量使用NEON内在函数,我想尝试使用ARM的官方编译器armcc编译本机库。我在任何地方读到armcc在使用内在函数时应该提供更好的优化代码。所以我从ARM网站上下载了DS-5的试用版,试着看看是否真的有任何速度差异。

DS-5似乎只是使用ARMCC工具链的Eclipse的修改版本,所以我安装了ADT插件。但是当我使用DS-5进行编译时,似乎仍然使用gcc而不是armcc生成代码。

您是否知道如何使用armcc强制DS-5或Eclipse构建Android本机代码?或者是否可以(以及如何)从命令行构建静态NDK库,然后替换我的项目中的库,以便将它们部署到测试手机中?

2 个答案:

答案 0 :(得分:2)

ARM DS-5 Community Edition不包含ARM compilerarmcc)。

如果能掌握armcc最好将处理繁重的算法与单独的编译单元(单独的C文件)分开,则使用armcc构建它们,就像对任何编译单元一样。获得目标文件后,convert them into an archive然后在Android.mk中将其用作LOCAL_STATIC_LIBRARIES += <your_archive>

我认为你不能明确地使用armcc构建Android兼容的库,主要是因为Bionic依赖性。

答案 1 :(得分:0)

即使Android拥有不同的C库(armcc),您也可以使用bionic构建Android兼容的静态库。关键是--library_interface的{​​{1}}标记。根据{{​​3}}:

  

在与符合ABI的C库链接时,使用格式为--library_interface = aeabi_ *的选项。形式的选项--library_interface = aeabi_ *确保编译器不会生成对ARM C库提供的任何优化函数的调用。

此外,还有一些标志可确保与Android EABI的兼容性,从而为Android armcc目标生成以下命令:
armeabi-v7a

然后,您可以使用armcc --library_interface=aeabi_clib --wchar32 --enum_is_int --no_hide_all --cpu=7-A --fpu=softvfp+vfpv3 -c -o libfunc.o libfunc.c创建一个静态库,该库可以与Android NDK链接为armar --create libfunc.a libfunc.o

我已经在Android KitKat 4.4.2上使用Android NDK r10d成功测试了这个。