我正在使用我的新应用程序,它可以处理手机摄像头拍摄的图像。我的手机是Nexus S,2.3.4。
我用捕获的数据创建了一个ARGB_8888位图。我知道ndk映像库,但它只支持2.2及更高版本。所以我把位图的int[]传给NDK,发现颜色的字节顺序是小端的。
我搜索了维基,发现arm架构是双端的。http://en.wikipedia.org/wiki/Endianness#Bi-endian_hardware
我的问题是,如果arm是双端字节序,如何判断特定设备的字节顺序?我应该在每次访问数据之前测试字节顺序吗?
发布于 2011-07-14 10:54:47
是的,大多数cpus采用双端字节序,但目前使用的大多数终端用户操作系统都选择使用小端字节序的cpus。沿着这些路线,ARM可以在两者中操作作为一种便利,它在ARM3之后的实际默认值是低字节顺序,这是它启动时的字节顺序模式。我认为人们可以放心地假设所有的Android设备都是低字节顺序的,否则如果不同的android设备是字节顺序的混合,这将是额外的工作。
因为网络字节顺序是大端的,所以将您计划用于数据交换的任何格式转换为网络字节顺序会很有帮助。不过,同样,在英特尔、视窗、iOS和安卓上的Mac是低端的,所以你可能只是用原生的端序来编写结构,并希望你想要将数据移植到的下一个伟大的操作系统不会变得高端序。
发布于 2011-10-29 07:08:46
直接从我的Nexus S:
> import java.nio.*;
> System.out.println(ByteOrder.nativeOrder());
LITTLE_ENDIAN还应该有一些方法来获得NDK中的排序。
发布于 2012-02-08 16:00:35
ARM处理器(一些安卓系统在其上运行)支持both endian格式。
在NDK-ROOT/platforms/android-x/arch-arm/usr/include/machine/endian.h中,您可以找到:
#ifdef __ARMEB__
#define _BYTE_ORDER _BIG_ENDIAN
#else
#define _BYTE_ORDER _LITTLE_ENDIAN
#endif使用-mbig-endian ARM option时,__ARMEB__是由gcc编译器定义的。即使大多数Android架构默认使用小字节顺序,您也不应该想当然地认为这是理所当然的,出于可移植性的原因,您的本机代码应该能够处理这两种字节顺序。
要做到这一点,您应该#include <endian.h>并检查BYTE_ORDER以正确地架构您的代码。
https://stackoverflow.com/questions/6212951
复制相似问题