Эндиантность 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

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

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

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

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

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

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

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

В 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 ARM . Даже если для большинства Android-систем по умолчанию используется немного endian, вы не должны считать это само собой разумеющимся и по соображениям переносимости ваш собственный код должен иметь возможность обрабатывать оба endiannes.

Для этого вы должны #include <endian.h> и проверить BYTE_ORDER на правильную архитектуру вашего кода.

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

просто.

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

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