JNI : Utilisation objet C++ - Java - Programmation
Marsh Posté le 05-11-2003 à 10:52:56
Si tu veux créer un objet purement C++ dans ton code natif, ou de manière générale toute structure exclusivement C ou C++, alors tu n'as rien de particulier à faire. Les new/delete et les malloc/free s'utilisent de la même manière qu'habituellement, et avec les mêmes risques que dans un programme purement C ou C++.
Par contre, si tu veux allouer un objet Java dans ton code native, comme par exemple une chaine de caractères, alors il faut utiliser les méthodes de la classe JNIEnv.
Maintenant, pour régler ton problème de segmentation, il n'y a pas 50 façons de savoir où ça se passe : le débogueur.
Marsh Posté le 05-11-2003 à 10:57:15
Après avoir lu ton autre topic, je précise ma réponse : ton objet MC est local à ta fonction, sa construction est faite par le compilateur, donc le destructeur sera appelé par le compilateur. Par contre, si tu observe des erreurs ou des fuites mémoire, c'est certainement que le destructeur de MadCity ou un de ceux qu'il invoque (directement ou indirectement) fait mal son boulot.
Marsh Posté le 06-11-2003 à 12:16:30
Merci a toi BifaceMcLeOD....
En ce qui concerne le programme que j'utilise, qui n'est pas le mien ils se sont rendus comptent qu'ils avaient geres ca un peu a l'arrache, et qu'en effet leurs destructeurs etait un peu absent ou tres peu present.
C'est l'environnement qui se charchait donc de liberer la memoire, donc quand j'utilisais juste JNI, la fin d'exectution faisait qu'unix liberer les ressources.
Le truc c'est qu'on l'utilise avec GLOBUS en tant que Grid Service, et cette utilisation ne permet pas la liberation des ressources a chaque execution...
Merci encore
Marsh Posté le 04-11-2003 à 12:28:20
Bonjour,
Je sais j'ai un post qui est un peu beaucoup pareil, mais il est pas tres clair alors je me dis que c'est peut etre pour ca que les gens repondent pas.
Mon probleme est le suivant :
J'essaie de creer un objet C++ dans une fonction native JNI, executer cet objet a l'aide de la fonction run, et renvoyer une valeur. La facon dont je l'utilise marche genre 10 fois, ou 20 fois , ou 30 fois d'affiler, ca depend, et apres je me tappe une erreur de segementation. Il semblerait que de la memoire est alloue mais pas libere :
//Voici mon code :
#include <iostream>
#include "uk_ac_wmin_cpc_madcityc_impl_MadCityCImpl.h"
#include "GT3MadCity.h"
JNIEXPORT jint JNICALL Java_uk_ac_wmin_cpc_madcityc_impl_MadCityCImpl_MadCityS(JNIEnv *, jclass, jint pied) {
MadCity MC;
MC.run_MadCity(pied);
return(MC.cartotal);
}
J'ai vu que par exemple pour creer un objet simple "String", il fallait faire comme ca :
str = (*env)->NewStringUTF("hello" );
Et pour liberer la memoire de la reference locale JNI il fallait faire ca :
(*env)->DeleteLocalRef(env, str);
Ma question principale est : est-ce que la facon dont je cree et utilise mon objet est choquante????, comment feriez vous a ma place????
Ensuite :
Dois-je utiliser (*env) pour gerer mon objet dans la fonction native, si oui comment????
Comme je n'utilise pas (*env) ,est-ce qu'une reference locale a l'objet est cree quand meme??? si oui comment dois-je la detruire?????
Merci...merci
---------------
La meilleure facon d'en apprendre toujours plus, c'est de ne pas retenir ce qu'on nous dit.