如何在android中使用arm_acle C语言扩展

Posted

技术标签:

【中文标题】如何在android中使用arm_acle C语言扩展【英文标题】:How to use arm_acle C language extensions in android 【发布时间】:2015-07-14 20:09:14 【问题描述】:

有很多使用 android 的 arm neon 内在函数的例子,ndk 甚至有一个例子。我已经让它毫无问题地工作了。

Arm 还提供 ACLE(Arm C 语言扩展),但我几乎找不到示例。 arm 文档本身仅建议包含 arm_acle.h 头文件,但是我仍然遇到错误。 Google 提供的帮助几乎为零:) 此外,搜索 arm 社区委员会的结果也很少。

难道人们不使用 acle,而是选择了内联汇编吗?

当我包含 arm_acle.h 并尝试使用 __ssat() 调用时,我必须进一步定义指令 __ARM_FEATURE_CRC32,并且在构建时出现错误“错误:'__builtin_arm_qadd'未在此范围内声明”

标题没有包含任何依赖项,并且文档没有列出特定的链接依赖项。

有什么建议吗?

或者我在这里忽略了一些基本的东西?

其他信息: 我的目标拱门是 armv7-a-neon 并且在构建时在 make 文件中被正确检测到。 然后我进一步定义“-mfloat-abi=softfp -mfpu=neon -march=armv7”,但无济于事。 如果我撤消我的附加调试定义,我只会得到“错误:#error“ACLE 内在函数支持未启用。”(霓虹灯支持和检测成功) 搜索我的代码库,arm_acle.h 头文件仅存在于 clang host 工具中,而 arm_neon.h 存在于多个预构建工具 arm 目录中。

正如我所说,arm_neon 工作检测工作正常,运行正常,是 arm_acle 组件不起作用。 搜索http://androidxref.com 之类的在线存储库似乎表明仅支持霓虹灯?

【问题讨论】:

您要告诉编译器以哪个 CPU/架构版本为目标?如果 Android 工具仍将 ARMv5 作为基准,我不会感到惊讶,在这种情况下,默认情况下您将无法访问像 ssat 这样的 v6 指令。事实上,您手动定义 should be predefined by a compiler based on the target CPU 的事实有点暴露您的选择可能是错误的。 【参考方案1】:

GCC(从 5.1 版开始)目前不完全支持 ARM C 语言扩展。 Android NDK 通常使用比这更旧的 GCC 版本,它也不完全支持 ACLE。

此页面https://gcc.gnu.org/onlinedocs/gcc/ARM-C-Language-Extensions-_0028ACLE_0029.html 提供了一些关于 ARM 和 AArch64 目标的当前 ACLE 实现水平的想法。正如您将看到的那样,GCC 当前提供的 ACLE 的唯一功能是 arm_acle.h 中的 CRC32 内在函数和您已经在 arm_neon.h 中找到的 Neon Intrinsics。

【讨论】:

这似乎与我所看到的相符。感谢您的详细信息和回答!

以上是关于如何在android中使用arm_acle C语言扩展的主要内容,如果未能解决你的问题,请参考以下文章

如何在android中运行C语言程序

c语言中如何使用android ADB命令??

如何在Android中使用汇编语言

如何在Android中获取语言列表

如何在 Java 中运行 C 代码

如何在 Java 中运行 C 代码