2

这是简单的二值化函数

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}'类型的无效操作数到二进制'operator>'

我在 Android.mk 中使用这个标志来启用 NEON:

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

1 回答 1

3

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

GCC 对向量类型更加愚蠢,不能将它们与诸如>or之类的 C/C++ 运算符一起使用&。所以你有两个基本的选择:

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

    NDK_TOOLCHAIN_VERSION=clang3.1它交给你Application.mk

  2. vld1q_u8使用for load、vst1q_u8for store、vcgtq_u8foroperator >vandq_u8for显式重写代码operator &
于 2012-12-08T10:53:16.070 回答