Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Converstion de type "jbyte" (java native interface) vers un "char" en C

9 réponses
Avatar
Chat
Bonjour,
j'ai une methode native en JAVA, qui appelle une fonction en C.
Jusque la pas de souci, ça se complique lorsque la fonction en C
travaille sur un jbyte et elle doit communiquer cette var. a une autre
fonction dont le prototype attends un char.
Syntaxiquement je veux faire un cast sur un
const jbyte *str
pour le changer en
char *com

est ce qu'il y a moyen de faire ça??? sans scrasher la jvm
Thanks.

9 réponses

Avatar
Régis Troadec
Salut,

"Chat" a écrit dans le message de news:
402b69ab$0$28130$
Bonjour,
j'ai une methode native en JAVA, qui appelle une fonction en C.
Jusque la pas de souci, ça se complique lorsque la fonction en C
travaille sur un jbyte et elle doit communiquer cette var. a une autre
fonction dont le prototype attends un char.
Syntaxiquement je veux faire un cast sur un
const jbyte *str


Un jbyte c'est du 8 bits signé, représenté en little-endian ou big-endian
suivant la plate-forme (spec JNI).

pour le changer en
char *com


char c'est pareil, c'est du 8 bits (CHAR_BIT = 8 (ou plus) dans <limits.h>)
signé.

est ce qu'il y a moyen de faire ça??? sans scrasher la jvm


oui.

Sinon,

typedef char jbyte;

Thanks.


Avatar
Horst Kraemer
On Sat, 14 Feb 2004 00:01:26 +0100, "Régis Troadec"
wrote:

Salut,

"Chat" a écrit dans le message de news:
402b69ab$0$28130$
Bonjour,
j'ai une methode native en JAVA, qui appelle une fonction en C.
Jusque la pas de souci, ça se complique lorsque la fonction en C
travaille sur un jbyte et elle doit communiquer cette var. a une autre
fonction dont le prototype attends un char.
Syntaxiquement je veux faire un cast sur un
const jbyte *str


Un jbyte c'est du 8 bits signé, représenté en little-endian ou big-endian
suivant la plate-forme (spec JNI).


Quelle est la différence entre 8 bit représenté en little-endian et 8
bits représenté en big-endian?

pour le changer en
char *com


char c'est pareil, c'est du 8 bits (CHAR_BIT = 8 (ou plus) dans <limits.h>)
signé.


char n'est pas nécessairement signé. Il y a des compilateurs où char
est non signé par défaut (p. ex. WATCOM).

--
Horst


Avatar
Régis Troadec
Salut,

"Horst Kraemer" a écrit dans le message de news:

On Sat, 14 Feb 2004 00:01:26 +0100, "Régis Troadec"
wrote:

Salut,

"Chat" a écrit dans le message de news:
402b69ab$0$28130$
Bonjour,
j'ai une methode native en JAVA, qui appelle une fonction en C.
Jusque la pas de souci, ça se complique lorsque la fonction en C
travaille sur un jbyte et elle doit communiquer cette var. a une autre
fonction dont le prototype attends un char.
Syntaxiquement je veux faire un cast sur un
const jbyte *str


Un jbyte c'est du 8 bits signé, représenté en little-endian ou
big-endian


suivant la plate-forme (spec JNI).


Quelle est la différence entre 8 bit représenté en little-endian et 8
bits représenté en big-endian?


Ah oui, tiens c'est con ça, c'est pas du multibyte, j'y avais pas pensé,
désolé.

pour le changer en
char *com


char c'est pareil, c'est du 8 bits (CHAR_BIT = 8 (ou plus) dans
<limits.h>)


signé.


char n'est pas nécessairement signé. Il y a des compilateurs où char
est non signé par défaut (p. ex. WATCOM).

--
Horst





Avatar
Emmanuel Delahaye
In 'fr.comp.lang.c', "Régis Troadec" wrote:

Un jbyte c'est du 8 bits signé, représenté en little-endian ou big-endian
suivant la plate-forme (spec JNI).


Pour un objet de 8 bits, ça fait une différence ?

typedef char jbyte;


Si on veut du signé, il faut être explicite :

typedef signed char jbyte;

--
-ed- [remove YOURBRA before answering me]
The C-language FAQ: http://www.eskimo.com/~scs/C-faq/top.html
C-reference: http://www.dinkumware.com/manuals/reader.aspx?lib=cpp
FAQ de f.c.l.c : http://www.isty-info.uvsq.fr/~rumeau/fclc/

Avatar
Antoine Leca
En ,
Horst Kraemer va escriure:
On Sat, 14 Feb 2004 00:01:26 +0100, "Régis Troadec"
wrote:
Un jbyte c'est du 8 bits signé, représenté en little-endian ou
big-endian suivant la plate-forme (spec JNI).


Quelle est la différence entre 8 bit représenté en little-endian et 8
bits représenté en big-endian?


Le sens des bits (poids faible ou bit de signe alias poids fort d'abord).

Ce qui n'empêche pas que cela n'importe que pour une sérialisation,
qui n'est probablement pas le problème ici. ;-)


Antoine


Avatar
Jean-Marc Bourguet
"Antoine Leca" writes:

En ,
Horst Kraemer va escriure:
On Sat, 14 Feb 2004 00:01:26 +0100, "Régis Troadec"
wrote:
Un jbyte c'est du 8 bits signé, représenté en little-endian ou
big-endian suivant la plate-forme (spec JNI).


Quelle est la différence entre 8 bit représenté en little-endian et 8
bits représenté en big-endian?


Le sens des bits (poids faible ou bit de signe alias poids fort d'abord).

Ce qui n'empêche pas que cela n'importe que pour une sérialisation,
qui n'est probablement pas le problème ici. ;-)


<HS>

Cela importe aussi pour certaines instructions en assembleur, par
exemple une qui renverrait le bit de poid le plus faible mais a 1.

Il faut aussi faire remarquer qu'on peut utiliser un sens pour les bit
et un autres pour les bytes. En fait, on peut utiliser encore un
autre ordre pour des unites de longueur superieure et arriver pour des
entiers representes sur 4 bytes a un ordre qui n'est ni grand boutien,
ni petit boutien (les premieres versions du compilateur C pour 8086
etaient dans ce cas).

Dans le meme genre de complication, si j'ai bonne memoire, le 68000
etait aussi assez amusant: grand boutien pour les bytes, petit boutien
pour les bits d'apres la documentation mais certaines intructions
utilisaient une numerotation des bits grand boutienne.

</HS>

--
Jean-Marc
FAQ de fclc: http://www.isty-info.uvsq.fr/~rumeau/fclc
Site de usenet-fr: http://www.usenet-fr.news.eu.org



Avatar
Pierre Maurette
"Horst Kraemer" a écrit ...
On Sat, 14 Feb 2004 00:01:26 +0100, "Régis Troadec"
wrote:

Salut,

"Chat" a écrit dans le message de news:
402b69ab$0$28130$
Bonjour,
j'ai une methode native en JAVA, qui appelle une fonction en C.
Jusque la pas de souci, ça se complique lorsque la fonction en C
travaille sur un jbyte et elle doit communiquer cette var. a une autre
fonction dont le prototype attends un char.
Syntaxiquement je veux faire un cast sur un
const jbyte *str


Un jbyte c'est du 8 bits signé, représenté en little-endian ou
big-endian


suivant la plate-forme (spec JNI).


Quelle est la différence entre 8 bit représenté en little-endian et 8
bits représenté en big-endian?

pour le changer en
char *com


char c'est pareil, c'est du 8 bits (CHAR_BIT = 8 (ou plus) dans
<limits.h>)


signé.


char n'est pas nécessairement signé. Il y a des compilateurs où char
est non signé par défaut (p. ex. WATCOM).


Oui, et même un caractère n'est sémantiquement pas un entier, signé ou non.
N'est-il pas souhaitable de conserver systématiquement char pour les
caractères, et de définir les types numériques :
typedef unsigned char ubyte;
typedef signed char sbyte;
(si ce n'est déjà fait dans un windef.h ou autre)
Ainsi :
typedef sbyte jbyte;
(le choix des noms ubyte et sbyte est peut-être discutable)
Pierre



Avatar
Chat
merci pour les infos mais est ce que je peux trouver sur le net un
tableau avec tous les types de conversions de données pour passer d'un
type C vers un type nativ ( je veux dire jQuelque chose) et vice versa.
Mon gros probleme, c que j'ai tous le tps des conversions dans le genre
a faire.
Aujourd'hui mon souci c de passer d'un unsigned char * vers du jchar
comment ça marche c histoire????
merci

In 'fr.comp.lang.c', "Régis Troadec" wrote:


Un jbyte c'est du 8 bits signé, représenté en little-endian ou big-endian
suivant la plate-forme (spec JNI).



Pour un objet de 8 bits, ça fait une différence ?


typedef char jbyte;



Si on veut du signé, il faut être explicite :

typedef signed char jbyte;




Avatar
Emmanuel Delahaye
In 'fr.comp.lang.c', "Pierre Maurette"
<mmaauurreettttttee.ppiieerrrree@@ffrreeee.ffrr> wrote:

Oui, et même un caractère n'est sémantiquement pas un entier, signé ou non.
N'est-il pas souhaitable de conserver systématiquement char pour les
caractères, et de définir les types numériques :
typedef unsigned char ubyte;
typedef signed char sbyte;
(si ce n'est déjà fait dans un windef.h ou autre)


C'est fait dans 'mon' "ed/inc/types.h" :

#ifndef H_ED_TYPES_20030502125527
#define H_ED_TYPES_20030502125527

#ifdef __cplusplus
extern "C"
{
#endif

/* macros ============================================================== */
/* constants =========================================================== */
/* types =============================================================== */

typedef unsigned char uchar;
typedef signed char schar;
typedef unsigned short ushort;
typedef unsigned int uint;
typedef unsigned long ulong;

/* structures ========================================================== */
/* internal public data ================================================ */
/* internal public functions =========================================== */
/* entry points ======================================================== */
/* public data ========================================================= */

#ifdef __cplusplus
}
#endif

#endif /* H_ED_TYPES_20030502125527 */

/* Guards added by GUARD (c) ED 2000-2003 Feb 14 2003 Ver. 1.5 */

--
-ed- [remove YOURBRA before answering me]
The C-language FAQ: http://www.eskimo.com/~scs/C-faq/top.html
C-reference: http://www.dinkumware.com/manuals/reader.aspx?lib=cpp
FAQ de f.c.l.c : http://www.isty-info.uvsq.fr/~rumeau/fclc/