Perte callback .jar depuis C++

d0x - 18 oct. 2018 à 17:37
 d0x - 19 oct. 2018 à 10:44
Bonjour à tous,

Je travaille habituellement en C++ et je me retrouve face à un problème très étrange qui relève peut-être du fonctionnement de la machine virtuelle java, je souhaiterai votre avis sur la question :

J'ai créé un .jar qui est un plugin pour une application java déjà existante.
J'ai également un .dll qui est chargé par le .jar à son lancement, il contient l'essentiel de mon application (le .jar sert juste à communiquer avec l'application d'origine)
Après avoir chargé ma .dll, le plugin java lui transmet des pointeurs vers quelques callback pour leur permettre d'échanger.

Jusqu'à aujourd'hui, je n'ai eu aucun problème et puis, suite à la génération d'une nouvelle version de mon .jar, je perds parfois la communication vers l'une des callbacks, de façon aléatoire.
C'est à dire qu'après un certain temps (très variable) d'utilisation, l'appel à l'une des callbacks du .jar n'aboutit pas... pourtant l'adresse appelée n'a pas changée...

Se peut-il que la VM de java "déplace" des bouts d'exécutable en mémoire à une nouvelle adresse durant l'exécution ?? Voyez vous une raison quelconque pour que ce phénomène se produise ??

Merci d'avance pour vos réponses et les pistes que vous pourriez m'apporter. :)

d!

1 réponse

KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 127
18 oct. 2018 à 18:07
Bonjour,

"Se peut-il que la VM de java "déplace" des bouts d'exécutable en mémoire à une nouvelle adresse durant l'exécution ?"
Cela peut arriver s'il y a des modifications ou suppressions de classes ou de jars qui étaient chargées par la JVM, mais cela devrait conduire à des exceptions particulièrement violentes, aléatoires sur l'ensemble des programmes gérées par la JVM, pas juste sur un seul callback.
0
Bonjour,

Merci beaucoup KX pour cette réponse, c'est une piste. :)

Y a t-il un moyen d'indiquer explicitement à Java que l'on ne souhaite pas qu'une méthode puisse être déplacé en court d'exécution ?

En fait, dans ce cas précis, la VM n'a pas de moyen de savoir que la callback (seul appel à cette méthode) est utilisée par un autre bout de code dont elle n'a pas connaissance puisqu'il s'agit de la .dll donc, elle considère peut être qu'il n'y a pas de risque à déplacer cet élément puisque rien (de ce qu'elle connait) ne pointe dessus...

Merci,

d!
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 127 > d0x
18 oct. 2018 à 18:42
Tu passes par JNI pour t'interfacer avec ta DLL ?

Parce que le garbage collector ne fonctionne pas sur le JNI, il n'y a donc pas de raison pour que Java supprime quoique ce soit à ce niveau là...

Est-ce qu'il y a des exceptions ? Si oui lesquelles ?
0
Non, j'utilise JNA.

Je n'ai pas l'impression qu'il y ait d'exception qui soit levée. Au bout d'un moment, l'appel à ma callback n'est juste plus appelée.

J'ai une trace juste avant l'appel, mais pas au début de ma callback.
En revanche, le reste des méthodes dans les différents threads de mon plugin .jar continus de tourner.
0
Rejoignez-nous