ProgramingTip

Android NDK의 엔디안

bestdevel 2021. 1. 6. 20:51
반응형

Android NDK의 엔디안


휴대폰 카메라에서 한 이미지를 처리하는 새 앱을 사용하고 있습니다. 내 휴대 전화는 Nexus S, 2.3.4입니다.

기지 한 데이터로 ARGB_8888 비트 맵을 만듭니다. ndk 이미지 라이브러리를 알고 싶습니다 2.2 이상 만 지원합니다. 그래서 Bitmap의 int []를 NDK에 전달하고 색상 순서가 little-endian임을 알았습니다.

위키를 검색 한 결과 arm 아키텍처가 bi-endian이라는 것을 알았습니다. http://en.wikipedia.org/wiki/Endianness#Bi-endian_hardware

내 질문은 팔이 바이 엔디안이라면 특정 장치에서 순서를 판단하는 방법입니다. 데이터에 액세스하기 전에 매번 바이트 순서를 테스트해야합니까?


예 대부분의 CPU 바이 엔디안이지만 사용되는 대부분의 최종 사용자 운영은 CPU를 사용하는 것을 선택합니다. ARM은 편의상 두 가지 모두에서 작동 할 수 있습니다. ARM 3 이후의 실제 재생은 시작되는 엔디안 모드 인 little-endianess입니다. 모든 Android 기기가 리틀 엔디안이라고 가정 할 수 있습니다. 다른 안드로이드 장치가 엔디안의 혼합 인 경우 추가 작업이 필요합니다.

네트워크 바이트 순서는 빅 엔디안 데이터 교환에 사용하려는 모든 형식을 네트워크 바이트 순서로 변환하는 것이 도움이됩니다. 다시 말하지만, Intel, Windows, iOS 및 Android의 Mac OS X는 리틀 엔디안 기본 엔디안으로 구조를 코딩하고 데이터를 이식하려는 다음 훌륭한 OS가 빅 엔디안이되지 않습니다. .


내 Nexus S에서 직접 :

> import java.nio.*;
> System.out.println(ByteOrder.nativeOrder());
LITTLE_ENDIAN

NDK에서받을 수있는 방법도 주문합니다.


일부 Android가 실행중인 ARM 프로세서는 두 엔디안 형식을 모두 지원 합니다 .

NDK-ROOT / 플랫폼 / android- [x] /arch-arm/usr/include/machine/endian.h에서 다음을 사용할 수 있습니다.

#ifdef __ARMEB__
#define _BYTE_ORDER _BIG_ENDIAN
#else
#define _BYTE_ORDER _LITTLE_ENDIAN
#endif

__ARMEB__-mbig-endian ARM 옵션을 사용할 때 gcc 컴파일러에 의해 정의 됩니다. 대부분의 Android 아키텍처가 기본적으로 리틀 엔디안을 사용하여 당연하게 생각할 수 있습니다. 하나의 구현 성 때문에 모두 처리 할 수 ​​있습니다.

하려면 그렇게 코드 아키텍처를 올바르게 #include <endian.h>확인 해야 우리합니다 BYTE_ORDER.


매우 간단한 답변을 제공하기 위해 다음 목록이 있습니다.

  • armeabi : LITTLE_ENDIAN
  • armeabi-v7a : LITTLE_ENDIAN
  • arm64-v8a : LITTLE_ENDIAN
  • 밉 : 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;
}

단순합니다.


Android NDK에는 사용할 수있는 타임에 확인하는 데 사용할 수있는 아래 매크로가 있습니다.

#if defined(__LITTLE_ENDIAN_BITFIELD)
#  error "Arch is Little Endian"
#elif defined (__BIG_ENDIAN_BITFIELD)
#  error "Arch is Big Endian"
#endif

귀하의 경우에는 Little-Endian을 가정하고 외장 소스가있는 경우 아래에 배치해야합니다.

#if _BYTE_ORDER != _LITTLE_ENDIAN || defined (__BIG_ENDIAN_BITFIELD)
#  error "Big-Endian Arch is not supported"
#endif

"lxgr"답변으로 시도했지만 LITTLE_ENDIAN도 교회입니다.

하지만 C ++로 작업하면서 다음 정보로 일부 파일을 읽었습니다. 50 4B 03 04 14 00 00 00 08 00 55 8A F4 3C 9B AA ...

처음 4 바이트를 서명하지 않음 Long으로 읽고 67324752 (헥사로)를 얻습니다.

4034B50

(처음 4 비트이지만 BIG_ENDIAN 아치에서 작업하는 것처럼)

그래서 아마도 "System.out.println (ByteOrder.nativeOrder ());" 자바에서 처리하는 방법에 관한 것이지만 NDK를 사용하여 C ++로 작업하는 경우 직접 확인해야합니다. 다음은 BIG_ENDIAN에서 오랫동안 읽은 엔디안을 축소하는 코드입니다.

long shrinkEndian(long value){
    long result = 0;
    result += (value & 4278190080) >> 24;
    result += (value & 16711680) >> 8;
    result += (value & 65280) << 8;
    result += (value & 255) << 24;

    return result;
}

참조 URL : https://stackoverflow.com/questions/6212951/endianness-of-android-ndk

반응형