我一直在研究一个拥有多个原生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库,然后替换我的项目中的库,以便将它们部署到测试手机中?
答案 0 :(得分:2)
ARM DS-5 Community Edition不包含ARM compiler
(armcc
)。
如果能掌握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成功测试了这个。