Android NDK的字节顺序
我正在与我的新应用程序处理从手机相机拍摄的图像。 我的手机是Nexus S 2.3.4。
我用捕获的数据创build一个ARGB_8888位图。 我知道ndk图像库,但它只支持2.2及以上。 所以我把Bitmap的int []传给NDK,发现颜色字节顺序是小尾数。
我search了维基,发现arm架构是双端的。 http://en.wikipedia.org/wiki/Endianness#Bi-endian_hardware
我的问题是如果arm是双端的,如何判断特定设备中的字节顺序? 每次访问数据之前,我应该testing字节顺序吗?
是的,大部分是双端的,但是现在大多数最终用户操作系统select使用小端的cpus。 按照这些方法,ARM可以在方便的情况下运行,而ARM 3之后的实际默认是little endia,它是启动的endian模式。我想我们可以有把握地假设所有的Android设备都是小端的,否则就会如果不同的Android设备是一个混合的endianess是额外的工作。
由于networking字节顺序是高端的,因此将您计划用于数据交换的任何格式转换为networking字节顺序可能很有帮助。 同样,Intel,Windows,iOS和Android上的Mac OS X是小端的,所以你可能只是编码本地sorting的结构,并希望下一个伟大的操作系统,你想要移植的数据不会是big-endian 。
直接从我的Nexus S:
> import java.nio.*; > System.out.println(ByteOrder.nativeOrder()); LITTLE_ENDIAN
也应该有一些方法来获得在NDK的sorting。
ARM处理器(一些Android正在运行)支持两种格式。
在NDK-ROOT / platforms / android- [x] /arch-arm/usr/include/machine/endian.h中可以find:
#ifdef __ARMEB__ #define _BYTE_ORDER _BIG_ENDIAN #else #define _BYTE_ORDER _LITTLE_ENDIAN #endif
当使用-mbig-endian
ARM选项时, -mbig-endian
由gcc编译器定义。 即使大多数Android架构在默认情况下使用的是little endian,您也不应该将其视为理所当然,而为了便于携带,您的本机代码应该能够处理两种endianne。
要做到这一点,你应该#include <endian.h>
并检查BYTE_ORDER
适当架构你的代码。
为了提供非常直接的答案,这里是一个列表:
- armeabi:LITTLE_ENDIAN
- armeabi-v7a:LITTLE_ENDIAN
- arm64-v8a:LITTLE_ENDIAN
- mips:LITTLE_ENDIAN
- mips64:LITTLE_ENDIAN
- x86:LITTLE_ENDIAN
- x86_64:LITTLE_ENDIAN
… Android API级别21。
bool isLittleEndian() { unsigned short word=0x0102; return *(char*)&word==2; }
简单。