2013-06-23 46 views
2

我一直在研究一个Android项目,它有几个本地C++库。使用Eclipse和ADT插件进行编译和调试非常有效。很明显,Android NDK使用某个版本的arm-linux-gnueabi-gcc来编译本地库。使用ARMCC编译Android本机库

因为我一直在大量使用NEON内部函数,所以我想尝试使用ARM的官方编译器armcc编译本机库。我在处处读到armcc在使用内在函数时应该给出更好的优化代码。所以我从ARM网站下载了DS-5的试用版,只是为了试试看看是否有真正的速度差异。

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

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

回答

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依赖关系,我认为。

+0

谢谢,我会试试看。我没有社区版本,但是完整的DS-5版本的30天试用版。 – NumberFour

+0

如果我只有一个用armcc编译的编译单元,我是否仍然需要将这个单个.o文件放入存档中? – NumberFour

+0

@NumberFour我环顾四周,看到几个职位抱怨,共识是创建一个档案。 HTTPS://android.googlesource。com/platform/ndk/+/master/docs/text/PREBUILTS.text http://stackoverflow.com/questions/7587965/android-add-prebuild-object-files – auselen

0

即使Android具有不同的C库(bionic),也可以使用armcc构建与Android兼容的静态库。关键是armcc--library_interface标志。根据the documentation

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

此外,还有几个标志,以确保与Android EABI导致下面的命令在Android 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

然后可以使用armar --create libfunc.a libfunc.o创建静态库可以将其与Android NDK链接为LOCAL_STATIC_LIBRARIES

我已经在Android KitKat 4.4.2上成功通过Android NDK r10d进行了测试。