2011-10-29 4 views
2

J'ai écrit du code qui transmet des valeurs entre java et c en utilisant jni.Quel type de données JNI?

Actuellement, toutes les valeurs numériques sont définis comme int (java) -> jnit (JNI/c) -> unsigned int (c)

Les œuvres de code, mais il est vraiment inefficace car tous les chiffres étant passe besoin de la mémoire disponible pour un nombre entier.

J'ai 3 types de valeurs dans mon code qui doivent contenir plusieurs gammes 0-4294967295, 0 à 255 et 0 à 1.

Je ne peux pas travailler sur les types de données compatibles dans les 3 langues « » .

Range   Java   C/JNI   C 
4294967296  int   jint   unsigned int 
256    ???   ???   unsigned char 
2    boolean  jboolean  ??? 

Pouvez-vous s'il vous plaît aviser quels types de données je dois utiliser pour les ??? s ci-dessus?

Merci G

+0

Sur certaines architectures (notamment ARM), travailler avec des valeurs 32 bits est plus rapide qu'avec des valeurs 16/8 bits. Donc, à moins que ce soit l'espace de stockage dont nous parlons, passer des paramètres comme 'int' /' jint' pourrait être une victoire nette. –

Répondre

1

Rappelez-vous, il n'y a pas de types non signés en Java. Donc, un Java int ne va pas réellement pouvoir stocker toutes les valeurs d'un C unsigned int. Vous faites également l'hypothèse qu'un C unsigned int a toujours une largeur de 32 bits. Il peut s'agir d'une taille différente, même si l'industrie a quelque peu standardisé la question.

Avec cela de la manière, en suivant la logique que vous avez ici, int est à jint est à unsigned int comme byte est à jbyte est à unsigned char, et comme boolean est à jboolean est à _Bool (un type de C99 sous-utilisé qui peut seulement tenir 1 ou 0 comme valeur)

Notez qu'un char en C est pas la même chose comme char en Java. le premier représente un seul octet, quel que soit le nombre de bits qu'il peut contenir, tandis que le second représente un caractère UTF-16. Notez également qu'un char peut être signé ou non signé C selon le compilateur et la plate-forme. Par conséquent, pour être sûr, vous devez utiliser explicitement signed char si le signe peut être important.

1

En ce qui concerne booléen en C il y a une réponse on this site

et une gamme de 256 seraient couverts par octet en Java mais ils sont signés de sorte qu'il peut se révéler plus simple d'utiliser un short. Essentiellement, les types java sont signés et la façon la plus facile de gérer cela est de s'assurer que le type de votre mapping est plus grand que la plage que vous voulez inclure si court pour une plage de 256 et long pour 4.2x10^9 comme couvertures int - 2.147.483.648 et une valeur maximale de 2.147.483.647.

+0

unsigned char * body = (* env) -> GetShortArrayElements (env, myjshortArray, 0); Je reçois un "avertissement: initialisation à partir d'un type de pointeur incompatible" – Beakie