在Android上编译NEON代码时出错

时间:2012-12-08 09:30:08

标签: android gcc android-ndk neon

这是简单的二值化函数

void binarize(void *output, const void *input, int begin, int end, uint8_t threshold) {
#ifdef __ARM_NEON__
    uint8x16_t thresholdVector = vdupq_n_u8(threshold);
    uint8x16_t highValueVector = vdupq_n_u8(255);
    uint8x16_t* __restrict inputVector = (uint8x16_t*)input;
    uint8x16_t* __restrict outputVector = (uint8x16_t*)output;
    for ( ; begin < end; begin += 16, ++inputVector, ++outputVector) {
        *outputVector = (*inputVector > thresholdVector) & highValueVector;
    }
#endif
}

在iOS上运行正常。但是,当我为Android编译它时,它给了我一个错误:

  

错误:类型'uint8x16_t {aka __vector(16)的无效操作数   __builtin_neon_uqi}'和'uint8x16_t {aka __vector(16)__ builtin_neon_uqi}'到二元'运算符&gt;'

我在Android.mk中使用此标志启用NEON:

ifeq ($(TARGET_ARCH_ABI),armeabi-v7a)
      LOCAL_ARM_NEON := true
endif

1 个答案:

答案 0 :(得分:3)

差异来自于不同的编译器。对于iOS,您使用Clang进行编译,但对于Android,您使用GCC构建代码(除非您覆盖默认值)。

GCC对于矢量类型更加愚蠢,不能将它们用于>&等C / C ++运算符。所以你有两个基本选择:

  1. 尝试使用最新的Android NDK r8c中的Clang进行编译

    NDK_TOOLCHAIN_VERSION=clang3.1添加到Application.mk

  2. 使用vld1q_u8加载明确重写代码,vst1q_u8代表商店,vcgtq_u8代表operator >代表vandq_u8代表operator &