本机组件,armeabi-v7a和拇指?

jww*_*jww 2 android android-ndk ndk-build

APP_ABI包含时armeabi-v7a,Android的构建系统将包含-mthumb为编译选项.

ARMv7-a是一个32位处理器系列.为什么Android使用-mthumb而不是-marm

使用NDK编译的本机组件必须使用-mthumb吗?或者可以使用-marm吗?

如果-marm可以,是否需要存在任何互通选项?

mst*_*sjo 8

Android使用-mthumb是因为它产生更紧凑的代码.处理器的位数与它无关.

在普通的ARM指令集中,每条指令都是32位,每条指令都非常富有表现力(有很多不同的指令可以做很多不同的事情).不幸的是,这也意味着代码可能有点大,因为每条指令需要4个字节.

引入拇指指令集来解决这个问题 - 这里每条指令只有16位长,因此你可以在同一空间中装入两倍的指令,但由于指令较短,因此没有那么多不同的指令.每条指令仍然在32位寄存器上运行,否则其行为与ARM指令完全相同,因此它只是一种不同的,更紧凑的方式来编写(主要)ARM指令的子集.由于指令数量有限,大多数事情往往需要比ARM模式更多的指令.因此,根据代码实际执行的操作,代码大小的实际减少并不完全是50%.此外,由于可能有比以前更多的指令,它实际上可能比以前运行得慢.(但由于它较小,它使用较少的指令缓存,另一方面可能会提高性能.)

实际上,Thumb代码往往比ARM代码慢,但更紧凑,因此对于大小比速度更重要的代码,你可以使用Thumb.

由于Thumb2(在ARMv7中可用),在Thumb指令集中有更多的表现力,因此性能差异更小 - 这就是为什么它在Android中默认启用 - 几乎在所有情况下它都会减小代码大小而不会显着影响表现.如果您有一些真正的性能关键代码,您可能需要进行基准测试,看看它是否会对您造成伤害或帮助.(对于使用ndk-build和Android.mk构建,请检查LOCAL_ARM_MODE变量.)

如果您手动构建代码,则可以选择是否添加-mthumb或者-marmAFAIK,无论您选择哪一个,都不需要任何额外的交互操作选项.