Android NDK的字节顺序

Mat*_*Bai 55 android android-ndk

我正在使用我的新应用程序处理从手机摄像头捕获的图像.我的手机是Nexus S,2.3.4.

我用捕获的数据创建了一个ARGB_8888位图.我知道ndk图片库,但它只支持2.2及以上版本.所以我将Bitmap的int []传递给NDK,发现颜色字节顺序是little-endian.

我搜索了wiki,发现arm架构是双端的. http://en.wikipedia.org/wiki/Endianness#Bi-endian_hardware

我的问题是如果arm是双端的,如何判断特定设备中的字节顺序?我应该在每次访问数据之前测试字节顺序吗?

lxg*_*xgr 42

直接来自我的Nexus S:

> import java.nio.*;
> System.out.println(ByteOrder.nativeOrder());
LITTLE_ENDIAN
Run Code Online (Sandbox Code Playgroud)

还应该有一些方法来获得NDK中的排序.


mP.*_*mP. 37

是的,大多数是cpus bi-endian,但是今天使用的大多数最终用户操作系统都选择在little-endian中使用cpus.顺便说一句,ARM既可以作为一种方便的操作,也可以在ARM 3之后的实际默认操作是小端 - 这是它启动的endian模式.我认为可以安全地假设所有Android设备都是小端,否则它会如果不同的Android设备是endianess的混合,那就是额外的工作.

由于网络字节顺序是big-endian,因此将您计划用于数据交换的任何格式转换为网络字节顺序会很有帮助.尽管如此,英特尔,Windows,iOS和Android上的Mac OS X都是小端的,因此您可能只需使用本机字节序编码结构,并希望下一个想要移植数据的优秀操作系统不会变成大端.

  • 相反,您可能遇到的95%的计算机都是小端的. (10认同)
  • 似乎所有Android系统都是小端. (5认同)
  • Android可能是小端,但Java不是.:/ http://docs.oracle.com/javase/6/docs/api/java/io/DataOutputStream.html#writeShort(int) (5认同)

meh*_*ehi 22

ARM处理器(运行某些Android)支持两种端格式.

在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
Run Code Online (Sandbox Code Playgroud)

__ARMEB__使用-mbig-endian ARM选项时由gcc编译器定义.即使大多数Android架构在默认情况下都使用小端,您也不应该认为这是理所当然的,并且出于可移植性的原因,您的本机代码应该能够处理两个端点.

为此,您应该#include <endian.h>检查BYTE_ORDER并正确构建代码.


Ale*_*ska 6

为了提供非常简单的答案,这里有一个列表:

  • 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开始.


NoA*_*gel 5

bool isLittleEndian() {
    unsigned short word=0x0102;
    return *(char*)&word==2;
}
Run Code Online (Sandbox Code Playgroud)

简单的。

  • 谢谢@NoAngel,但有时我们需要条件编译 (2认同)