android - Android 没有 qsort_r(或者如何禁用强制 Thumb 在 Android ARM 代码中使用 CLZ)

标签 android arm libc thumb qsort

我想做的(高级):在 Android 上使用 qsort_r。

没有默认实现。所以我从 BSD 获取了一个。不幸的是,它需要 fls 函数,而 Android 上也没有该函数。因此,我获取了 Apple Open Source Libc 库,并将 ARM 实现复制到内联程序集中。现在我得到了这个:

Assembler messages:
Error: selected processor does not support Thumb mode `clz r3,r0'
Error: cannot honor width suffix -- `rsb r0,r3,#32'

AFAIR ARM-6 不支持 Thumb 模式。那么我该如何强制这个文件使用非 Thumb 模式,或者纯 C 实现是否可用于 fls?

(天哪,为什么我必须玩这么低的级别才能拥有 qsort_r...)

最佳答案

在您的 Android.mk 文件中,以下是如何进行设置以编译代码的拇指、 ARM 和 NEON 版本。汇编语言源文件需要在 makefile 中将“S”大写,但实际名称不需要大写。后缀“.arm”和“.arm.neon”仅出现在 makefile 中,而不是名称的一部分(例如,下面的文件名为 main.c、main_asm.s、test.c 和 test_asm.s)。

LOCAL_ARM_MODE := arm  # remove this if you want thumb mode
LOCAL_ARM_NEON := true # remove this if you want armv5 mode

# this flag will allow neon intrinsics in your C files
LOCAL_CFLAGS := -mfpu=neon -march=armv7

LOCAL_SRC_FILES := \
          main.c.arm \
          test.c.arm.neon \
          main_asm.S.arm \
          test_asm.S.arm.neon \

关于android - Android 没有 qsort_r(或者如何禁用强制 Thumb 在 Android ARM 代码中使用 CLZ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14033017/

相关文章:

rust - 如何在 Rust 中初始化 sigset_t 或其他用作 "out parameters"的变量?

android - 如何从第一个选项卡的viewpager的第二个选项卡中更新recyclerview?

android - 如何使RealtiveLayout中的ToggleButton和ImageButton高度相同?

c - 为什么retarget.o归档到静态库中时,retarget.c中的 "_write"等函数没有链接?

python - 在 Raspberry pi 上安装 Informix Client SDK

c - 通过链接器运行程序时出现段错误?

android - 产品 flavor : Duplicate class found

android - 如何更改图像裁剪框?

gcc - 检测预处理器中的 ARM NEON 可用性?

c - stat(2) 线程安全吗?