Perte callback .jar depuis C++

- - Dernière réponse :  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!
Afficher la suite 

Votre réponse

1 réponse

Messages postés
15869
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
17 décembre 2018
0
Merci
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.
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!
KX
Messages postés
15869
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
17 décembre 2018
> d0x -
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 ?
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.
Commenter la réponse de KX

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.