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
'ProgramingTip' 카테고리의 다른 글
Maven : jar 포장에만 outputDirectory를 지정 하시겠습니까? (0) | 2021.01.06 |
---|---|
기본 클래스에서 하위 클래스 이름을 찾는 방법은 무엇입니까? (0) | 2021.01.06 |
클로저 : 왜 그렇게 유용할까요? (0) | 2021.01.05 |
표준 라이브러리에서 가장 유용한 Python 모듈? (0) | 2021.01.05 |
이름 값 대신 클래스를 사용하는 jQuery 유효성 검사 (0) | 2021.01.05 |