Perte lien callback C++/Java
Bonjour,
Je suis face à un problème difficile à diagnostiquer, peut-être que quelqu'un parmi vous aura une idée.
Mon application est divisée en deux parties distinctes, un petit "plugin" Java (qui sert de relai pour la partie matérielle) et un client lourd en C++.
Au démarrage de l'application, un ensemble de callbacks vers le plugin Java sont envoyés au client C++ afin que les deux parties puissent échanger.
Côté Java, on a un bout de code qui ressemble à cela :
TestLib INSTANCE = (TestLib) Native.loadLibrary("myLib.dll", TestLib.class, W32APIOptions.DEFAULT_OPTIONS); // Pour initialiser la callback côté C++ { final TestLib.myCallbackImplementation myImpl = new TestLib.myCallbackImplementation(); TestLib.INSTANCE.setMyCallback(myImpl); } // Pour faire le job quand la callback est appelée public interface myCallback extends Callback { void callback(double x, double y); } public class myCallbackImplementation implements myCallback { @Override public void callback(double x, double y) { // Do some stuff } }
Et côté C++ :
// A l'initialisation void MyDevice::setMyCallback(moveCallback callback) { _moveCallback = callback; } //Puis quand nécessaire d'appeler le plugin bool MyDevice::doSyncMove() { if (_moveCallback) { auto timeout = 200; _isMoving = true; _error = true; (*_moveCallback )(_x, _y); while (_isMoving && --timeout) Sleep(50); result = !_error && !_isMoving; _error = false; } return result; }
Tout cela fonctionne globalement très bien. J'initialise ainsi un certain nombre de callbacks ayant toutes leur fonction spécifique.
MAIS.... de façon complètement aléatoire à certains moments (ça peut être 10 minutes ou 4 heures) tout à coup l'une de ces callbacks ne fonctionne plus, comprendre par là que l'appel fait côté C++ n'arrive jamais côté Java...
J'ai vérifié que l'adresse de la callback côté C++ n'a pas été corrompue (elle est la même depuis l'initialisation jusqu'au moment de la perte de "connexion")
De plus, lorsque l'appel a échoué une fois, les appels suivants ne fonctionnent pas non plus.
Par ailleurs, le plugin Java qui, en dehors de cette callback, continue d'effectuer d'autres tâches, semble continuer à tourner parfaitement correctement.
Si des personnes parmi vous ont déjà rencontré ce problème ou ont une idée de sa raison (ou encore mieux de sa résolution) je vous en serai grandement reconnaissant !
Merci par avance et bonne journée.
Windows / Chrome 109.0.0.0
- Perte lien callback C++/Java
- Waptrick java football - Télécharger - Jeux vidéo
- Jeux java itel - Télécharger - Jeux vidéo
- Lien url - Guide
- Créer un lien pour partager des photos - Guide
- Eclipse java - Télécharger - Langages
1 réponse
Bonjour,
Si j'ai bien compris ton code, tu produis un fichier dll dans ton code java auquel tu lies ton programme C++ ? À moins que le plugin plante et fasse planter le programme C++ en cascade, je ne vois pas trop d'explication. L'adresse des fonctions exposées par ton fichier dll n'a aucune raison de changer.
L'idéal serait de faire un exemple minimal reproductible et de tracer ce qui se passe côté C++ avec un débogueur (par exemple gdb) et côté java en loggant ce qui se passe.
Le côté aléaloire laisse penser qu'il y a une erreur mémoire quelque part. En C++ des outils comme valgrind peuvent t'aider à les détecteur
Sinon, je vois deux manières de contourner le problème, c'est de faire communiquer les deux programmes autrement :
- Tu peux opter pour une technologie comme CORBA qui permet de faire du C++ et du Java :
- Tu peux adapter le code du plugin de sorte à ce qu'il expose une API réseau auquel le programme C++ se connecte en local (en s'inspirant de ceci).
Bonne chance