Perte lien callback C++/Java

Fermé
Laurent - Modifié le 3 mars 2023 à 15:35
mamiemando Messages postés 33093 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 4 mai 2024 - 3 mars 2023 à 15:47

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

A voir également:

1 réponse

mamiemando Messages postés 33093 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 4 mai 2024 7 752
Modifié le 3 mars 2023 à 15:48

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

0