2012-12-08 53 views
2

NEON編譯代碼時,下面是簡單的二值化功能錯誤在Android

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它給了我一個錯誤:

error: invalid operands of types 'uint8x16_t {aka __vector(16) __builtin_neon_uqi}' and 'uint8x16_t {aka __vector(16) __builtin_neon_uqi}' to binary 'operator>'

我使用此標誌在Android.mk啓用NEON:

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

回答

3

的差異主要是因爲不同的編譯器。對於iOS,您正在使用Clang進行編譯,但對於Android,您正在使用GCC編譯代碼(除非您覆蓋默認設置)。

GCC對於矢量類型更加愚蠢,不能將它們與C/C++運算符(如>&)一起使用。所以,你有兩種基本的選擇:

  1. 嘗試從最新的Android NDK R8C

    NDK_TOOLCHAIN_VERSION=clang3.1Application.mk這鏗鏘編譯。

  2. 改寫明確使用operator >vld1q_u8負載,vst1q_u8店面,vcgtq_u8vandq_u8代碼爲operator &
+0

沒有嘗試的第一選擇,但第二個偉大工程。謝謝! – Max