65 votes

Endianité du NDK Android

Je travaille avec ma nouvelle application qui a traité l'image capturée à partir de téléphone portable appareil photo. Mon téléphone est le Nexus S, 2.3.4.

J'ai créer un ARGB_8888 Bitmap avec les données capturées. Je sais que le ndk image lib, mais c'est seulement le soutien 2.2 et au-dessus. Donc je passe l'int[] de Bitmap à NDK et retrouve de la couleur d'ordre des octets est little-endian.

J'ai cherché sur le wiki et trouvé architecture arm est bi-endian. http://en.wikipedia.org/wiki/Endianness#Bi-endian_hardware

Ma question est de savoir si le bras est bi-endian, comment juger de l'ordre des octets dans le dispositif spécifique? Dois-je tester l'ordre d'octet à chaque fois avant d'accéder aux données?

44voto

lxgr Points 992

Directement depuis mon Nexus S:

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

Il devrait également y avoir un moyen d'obtenir la commande dans le NDK.

40voto

mP. Points 7516

Oui la plupart des processeurs bi-endian, mais la plupart des utilisateurs des systèmes d'exploitation en usage aujourd'hui choisir d'utiliser les processeurs en little-endian. Le long de ces lignes, les BRAS peuvent fonctionner à la fois comme une commodité, sa valeur par défaut après 3 BRAS est peu endianess qui est le endian mode il démarre. Je pense que l'on peut présumer que tous les appareils Android sont en little endian, sinon ce serait un travail supplémentaire si différents appareils android ont été un mélange de endianess.

Parce que l'ordre des octets de réseau est big-endian, il peut être utile de convertir n'importe quel format que vous comptez utiliser pour l'échange de données d'ordre des octets de réseau. Encore une fois, cependant, Mac OS X sur Intel, Windows, iOS et Android sont little-endian, alors vous pourriez le code en place des structures avec le natif de stockage et espère que le prochain système d'exploitation que vous souhaitez port de données pour ne pas aller big-endian.

24voto

mehy Points 288

Les processeurs ARM (sur lesquels Android s'exécute) prennent en charge les deux formats Endian . Dans votre NDK-ROOT / plates-formes / androi-x / arch-arm / usr / include / machine / _types.h, vous pouvez trouver:

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

Donc, si vous n’ajoutez pas -D_ ARMEB _, vous utiliserez le format Little Endian par défaut.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X