【问题标题】:Use ARMCC to compile Android native library使用ARMCC编译Android原生库
【发布时间】:2013-06-23 16:27:16
【问题描述】:

我一直在开发一个包含多个原生 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 生成的。

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

【问题讨论】:

    标签: android android-ndk arm armcc


    【解决方案1】:

    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 依赖项。

    【讨论】:

    【解决方案2】:

    即使 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 创建一个静态库,该库可以作为LOCAL_STATIC_LIBRARIES 与Android NDK 链接。

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

    【讨论】:

      猜你喜欢
      • 2013-06-30
      • 2017-11-02
      • 2017-01-17
      • 1970-01-01
      • 2015-05-26
      • 2013-02-02
      • 1970-01-01
      • 1970-01-01
      • 2012-09-15
      相关资源
      最近更新 更多