Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/195.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 本机组件、armeabi-v7a和thumb?_Android_Android Ndk_Ndk Build - Fatal编程技术网

Android 本机组件、armeabi-v7a和thumb?

Android 本机组件、armeabi-v7a和thumb?,android,android-ndk,ndk-build,Android,Android Ndk,Ndk Build,当APP_ABI包含armeabi-v7a时,Android的构建系统将包含-mthumb作为编译选项 ARMv7-a是一个家族。为什么Android使用-mthumb而不是-marm 使用NDK编译的本机组件必须使用-mthumb?或者可以使用-marm 如果-marm正常,是否需要提供任何互通选项?Android使用-mthumb,因为它可以生成更紧凑的代码。处理器的比特数与此无关 在正常的ARM指令集中,每条指令都是32位的,每条指令都很有表现力(有不同的指令可以做很多不同的事情)。不幸的

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

ARMv7-a是一个家族。为什么Android使用
-mthumb
而不是
-marm

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


如果
-marm
正常,是否需要提供任何互通选项?

Android使用
-mthumb
,因为它可以生成更紧凑的代码。处理器的比特数与此无关

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

thumb指令集是为了解决这个问题而引入的——这里每条指令只有16位长,因此可以在同一空间中容纳两倍多的指令,但由于指令较短,因此没有那么多不同的指令。每个指令仍然在32位寄存器上运行,并且在其他方面的行为与ARM指令完全相同,因此它只是一种不同的、更紧凑的方式来编写(大部分)ARM指令的子集。由于指令数量有限,大多数情况下都需要比ARM模式多一点的指令。因此,根据代码的实际功能,代码大小的实际减少并不完全是50%。此外,由于指令可能比以前多,它实际上可能比以前运行得慢。(但因为它更小,所以它使用更少的指令缓存,这在另一方面可能有利于性能。)

实际上,Thumb代码往往比ARM代码慢,但更紧凑,所以对于大小比速度更重要的代码,应该使用Thumb

由于Thumb2(在ARMv7中可用),Thumb指令集的表现力更强,因此性能差异更小——这就是为什么Android默认启用Thumb2的原因——在几乎所有情况下,它都会减少代码大小,而不会显著影响性能。如果您有一些真正对性能至关重要的代码,您可能希望对其进行基准测试,看看它是否对您有好处。(对于使用ndk build和Android.mk的构建,请检查本地_ARM_MODE变量。)


如果您手动构建代码,您可以选择是添加
-mthumb
还是
-marm
,而且不管您选择哪一个,您都不需要任何额外的交互选项。

总结最后两个问题的结果:Android API通常并不重要。然而,有一些警告。(1) API必须提供ABI支持。例如,
armeabi
arm-eabi-v7a
需要API 3;而
x86
mips
需要API 9。(2) 本机代码是通用的;并且不依赖于专门的平台功能链接传感器。显然,如果我在做特定于平台的事情,比如对传感器进行编程,API级别会很重要。对吗?对,听起来对。我自己没有使用过传感器,所以我不知道该API的详细信息,但一般来说,是的,只有在使用系统中的实际API时,API级别才起作用。如果您使用纯计算库,它通过内存缓冲区等进行所有输入/输出,您可以将其构建为最低API级别。此外,您还可以混合用于构建不同架构的API级别。如果您在project.properties中有target=android-3,ndk build将实际为x86和mips使用android-9(如果启用了这些体系结构)。生成的APK将在API级别3及以上的所有设备上运行。由于没有任何官方android设备的x86或mips运行的API级别低于9级,因此采用更高的API级别构建这些设备并没有什么坏处。对于所有ARM设备,它将使用API级别3构建。因此,它适用于API级别>=3的所有设备。