如何检测Android NDK工具链?

时间:2015-08-09 14:35:38

标签: android android-ndk c-preprocessor

我调整了一些源文件,以便在选定的位置使用内联汇编。一个地方是旋转,我在那里看到使用NDK工具生成的4到6条指令。 (相关,请参阅Near constant time rotate that does not violate the standards)。

当我尝试使用类似的东西时:

template<> inline word32 rotlFixed<word32>(word32 x, unsigned int y)
{
    assert(y < sizeof(word32));
    __asm__ ("ror %0, %1" : "+g" (x) : "I" ((unsigned char)(32-y)));
    return x;
}

template<> inline word32 rotrFixed<word32>(word32 x, unsigned int y)
{
    assert(y < sizeof(word32));
    __asm__ ("ror %0, %1" : "+g" (x) : "I" ((unsigned char)y));
    return x;
}

结果是:

$ make -f GNUmakefile-cross 
arm-linux-androideabi-g++ -DNDEBUG -g2 -Os -mfloat-abi=softfp -mfpu=vfpv3-d16 \
  -mthumb --sysroot=/opt/android-ndk-r10e/platforms/android-21/arch-arm \
  -I/opt/android-ndk-r10e/sources/cxx-stl/stlport/stlport/ -c 3way.cpp
.../ccwZw2eI.s: Assembler messages:
.../ccwZw2eI.s:2123: Error: ror #imm not supported -- `ror r0,#16'
.../ccwZw2eI.s:2133: Error: ror #imm not supported -- `ror r3,#24'
.../ccwZw2eI.s:2847: Error: ror #imm not supported -- `ror r6,#10'
...

因此编译器不支持立即8版本的旋转。由于存在如此多的寄存器(相对而言),因此损失并不大。但我希望能够识别出这种情况,因为rotlFixedrotrFixed应该使用该指令的直接版本。

现在,寻找关键的东西来确定情况:

$ arm-linux-androideabi-cpp -dM < /dev/null | grep -i android
#define __ANDROID__ 1
$ arm-linux-androideabi-cpp -dM < /dev/null | grep -i aosp
$ arm-linux-androideabi-cpp -dM < /dev/null | grep -i ndk
$

NDK工具链似乎只提供__ANDROID__。我相信其他原生移动工具链也定义了它,因此我无法使用它。并且没有__ANDROID_CC__或类似的。

如何检测Android NDK工具链?

1 个答案:

答案 0 :(得分:0)

__ANDROID_NDK__只能由NDK工具链定义。