Подтвердить что ты не робот

Эндиантность Android NDK

Я работаю с моим новым приложением, которое обрабатывает захваченное изображение с камеры мобильного телефона. Мой телефон - Nexus S, 2.3.4.

Я создаю битмап ARGB_8888 с захваченными данными. Я знаю библиотеку ndk image, но она поддерживает только 2.2 и выше. Поэтому я передаю int [] из Bitmap в NDK и обнаружил, что порядок байтов цвета малозначен.

Я искал вики, и найденная арка была двунаправленной. http://en.wikipedia.org/wiki/Endianness#Bi-endian_hardware

Мой вопрос в том, является ли рука двунаправленной, как оценивать порядок байтов в определенном устройстве? Должен ли я каждый раз проверять порядок байтов перед доступом к данным?

4b9b3361

Ответ 1

Да, большинство cpus bi-endian, но большинство используемых в настоящее время операционных систем конечных пользователей предпочитают использовать cpus в little-endian. Вдоль этих линий ARM может работать как в удобстве, так и в качестве фактического значения по умолчанию после того, как ARM 3 является малоконцентричным, и это конечный режим, в котором он запускается. Я думаю, можно с уверенностью предположить, что все устройства Android мало ориентированы, иначе быть дополнительной работой, если различные устройства для андроидов были смесью endianess.

Поскольку порядок сетевых байтов является широковещательным, может оказаться полезным преобразовать любой формат, который вы планируете использовать для обмена данными, в сетевой порядок байтов. Опять же, Mac OS X на Intel, Windows, iOS и Android малопригодна, поэтому вы можете просто скопировать структуры с естественной энтузиазмом и надеяться, что следующая отличная ОС, к которой вы хотите перенести данные, не идет по большому счету.

Ответ 2

Непосредственно из моего Nexus S:

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

Также должен быть некоторый способ получить упорядочение в NDK.

Ответ 3

ARM процессоры (на которых работает какой-либо Android) поддерживает оба формата endian.

В NDK-ROOT/platform/android- [x]/arch-arm/usr/include/machine/endian.h вы можете найти:

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

__ARMEB__ определяется gcc-компилятором при использовании опции -mbig-endian

Ответ 4

Чтобы обеспечить очень простой ответ, вот список:

  • armeabi: LITTLE_ENDIAN
  • armeabi-v7a: LITTLE_ENDIAN
  • arm64-v8a: LITTLE_ENDIAN
  • mips: LITTLE_ENDIAN
  • mips64: LITTLE_ENDIAN
  • x86: LITTLE_ENDIAN
  • x86_64: LITTLE_ENDIAN

... с уровня API Android 21.

Ответ 5

bool isLittleEndian() {
    unsigned short word=0x0102;
    return *(char*)&word==2;
}

просто.