Précédent   Forum du club des développeurs et IT Pro > Java > Général Java
Général Java Java SE, Java ME, APIs, Persistance, JDBC, Spring, XML. Avant de poster -> FAQ Java, Sources Java
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 17/11/2012, 11h16   #1
®om
Expert Confirmé
 
Avatar de ®om
 
Inscription : janvier 2005
Messages : 2 807
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 2 807
Points : 2 821
Points : 2 821
Par défaut JNI, ThrowNew, sprintf et free

Bonjour,

Dans le code natif de JNI, dans certains cas on "lève des exceptions".
Mais comment fait-on si l'on désire un message d'erreur "dynamique" (pour y inclure des variables) ? En particulier, quand appeler le "free()" sur le char* ?

Si je fais ça :
Code :
1
2
3
4
5
6
7
8
char *msg = (char *) malloc(32 * sizeof(char));
int value = ...;
if (value <= 0) {
  snprintf(msg, 32, "value must be positive: %d", value);
  (*env)->ThrowNew(env, cl_exception, msg);
  free(msg); /* is it correct? */
  return;
}
est-ce correct ?

Est-ce que ThrowNew fait une copie de "msg" ?

Je pense que c'est le cas, sinon c'est problématique.

Cela veut-il dire qu'à chaque fois qu'on passe un char * (par exemple) à une fonction qui doit en garder une référence, elle doit toujours faire une copie du contenu ?
®om est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/11/2012, 12h34   #2
tchize_
Expert Confirmé Sénior
 
Avatar de tchize_
 
Homme
Responsable de service informatique
Inscription : avril 2007
Messages : 18 279
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 33
Localisation : Belgique

Informations professionnelles :
Activité : Responsable de service informatique
Secteur : Service public

Informations forums :
Inscription : avril 2007
Messages : 18 279
Points : 32 755
Points : 32 755
Envoyer un message via MSN à tchize_ Envoyer un message via Skype™ à tchize_
il me semblerait logique dans ce cas ci qu'il y aie copie. L'exception va devoir être créée, le message d'une exception c'est un java.lang.String, ce qui n'a rien à voir avec un char* puisque un java.lang.String utilise un tableau java.

Maintenant, selon moi, le meilleur moyen d'être fixé, c'est de faire un test simple


Code :
1
2
3
4
5
6
7
8
9
10
11
char *msg = (char *) malloc(32 * sizeof(char));
int value = ...;
if (value <= 0) {
  snprintf(msg, 32, "value must be positive: %d", value);
  (*env)->ThrowNew(env, cl_exception, msg);
  //free(msg); /* is it correct? */
  // Verifier la copie
  snprintf(msg, 32, "Ho mon dieu, pas de copie!!");  
  // Memory leak possible, mais c'est juste le temps de tester :)
  return;
}
Note: j'ai trouvé un exemple ici qui fait un free

http://stackoverflow.com/questions/2...ns-in-jni-code
__________________
⥀⥁ Чиз faq java, cours java, javadoc. Pensez à et
Laisse entrer le jour après une nuit sombre. Si tu es toujours là, tu n'es pas faite pour mourir.
tchize_ est actuellement connecté   Envoyer un message privé Réponse avec citation 10
Vieux 19/11/2012, 10h13   #3
®om
Expert Confirmé
 
Avatar de ®om
 
Inscription : janvier 2005
Messages : 2 807
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 2 807
Points : 2 821
Points : 2 821
Je viens de tester, je confirme il en fait bien une copie.

Par contre, du coup, en C c'est dommage, on est obligé à chaque fois de faire des copies des paramètres pointés, pour les mettre "en lieu sûr", même si le paramètre était déjà "en lieu sûr", mais on ne peut pas le savoir.
®om est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/11/2012, 11h07   #4
tchize_
Expert Confirmé Sénior
 
Avatar de tchize_
 
Homme
Responsable de service informatique
Inscription : avril 2007
Messages : 18 279
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 33
Localisation : Belgique

Informations professionnelles :
Activité : Responsable de service informatique
Secteur : Service public

Informations forums :
Inscription : avril 2007
Messages : 18 279
Points : 32 755
Points : 32 755
Envoyer un message via MSN à tchize_ Envoyer un message via Skype™ à tchize_
pour les paramètres "en lieu sur", il n'y a que la jstring N'oublie pas que tout ce qui concerne la jvm n'est pas nettoyé par free() mais par le garbage collector
__________________
⥀⥁ Чиз faq java, cours java, javadoc. Pensez à et
Laisse entrer le jour après une nuit sombre. Si tu es toujours là, tu n'es pas faite pour mourir.
tchize_ est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/11/2012, 13h06   #5
®om
Expert Confirmé
 
Avatar de ®om
 
Inscription : janvier 2005
Messages : 2 807
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 2 807
Points : 2 821
Points : 2 821
Citation:
Envoyé par tchize_ Voir le message
pour les paramètres "en lieu sur", il n'y a que la jstring N'oublie pas que tout ce qui concerne la jvm n'est pas nettoyé par free() mais par le garbage collector
Je parlais en général en C, pas forcément en lien avec JNI.
®om est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 15h20.


 
 
 
 
Partenaires

Hébergement Web