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; } 

简单。