我调整了一些源文件,以便在选定的位置使用内联汇编。一个地方是旋转,我在那里看到使用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版本的旋转。由于存在如此多的寄存器(相对而言),因此损失并不大。但我希望能够识别出这种情况,因为rotlFixed
和rotrFixed
应该使用该指令的直接版本。
现在,寻找关键的东西来确定情况:
$ 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工具链?
答案 0 :(得分:0)
__ANDROID_NDK__
只能由NDK工具链定义。