JNI : Attaquer un application déjà lancée
Tony
-
Tony -
Tony -
Bonjour à tous!
Voila mon problème est le suivant :
comment, à partir d'un programme C/C++, attaquer une application Java déja lancée (donc en faite attaquer la JVM) pour modifier cette application Java !?
Avec la JNI il est possible soit de modifier une application Java seulement si c'est l'application Java qui a fait appelle à une procédure ou une fonction C d'une librairie (dll ou so),
soit que démarrer un JVM et de créer des classes et objets.
Donc comment faire pour accéder à une application Java déja lancée???
En fait voilà ce que fait mon programme :
-c'est une IHM (swing) qui permet de gérer des saisies et des sauvegardes dans des fichiers
-cette IHM permet aussi de lancer des programmes (Fortran) de calculs
Ces programmes de calculs appelle une procédure C en lui passant en paramètre un entier. Cet entier correspond au pourcentage d'avancement du calcul.
Cette procédure C doit en fait faire avancer une JProgressBar de l'IHM Java (barAvancement.setValue(int pourcentage) )
Mais bon en JNI ça marche pas car cette procédure n'est pas appelé par l'IHM Java!
Voilà!
Avez-vous une solution? J'avais pensé à de la mémoire partagée pour stocker l'entier !!?
Voila mon problème est le suivant :
comment, à partir d'un programme C/C++, attaquer une application Java déja lancée (donc en faite attaquer la JVM) pour modifier cette application Java !?
Avec la JNI il est possible soit de modifier une application Java seulement si c'est l'application Java qui a fait appelle à une procédure ou une fonction C d'une librairie (dll ou so),
soit que démarrer un JVM et de créer des classes et objets.
Donc comment faire pour accéder à une application Java déja lancée???
En fait voilà ce que fait mon programme :
-c'est une IHM (swing) qui permet de gérer des saisies et des sauvegardes dans des fichiers
-cette IHM permet aussi de lancer des programmes (Fortran) de calculs
Ces programmes de calculs appelle une procédure C en lui passant en paramètre un entier. Cet entier correspond au pourcentage d'avancement du calcul.
Cette procédure C doit en fait faire avancer une JProgressBar de l'IHM Java (barAvancement.setValue(int pourcentage) )
Mais bon en JNI ça marche pas car cette procédure n'est pas appelé par l'IHM Java!
Voilà!
Avez-vous une solution? J'avais pensé à de la mémoire partagée pour stocker l'entier !!?
2 réponses
Salut,
je ne vois pas trop comment tu pourrais faire pour passser à une interaction C java, puisque JNI comme tu le dit ne permet de faire que l'inverse.
Cependant tu peux créer un petit listener en java qui ira lire les resultat de ta routine en c.
je m'explique tu lance ton prog en c qui ecrira par exemple ses resultat d'avancement regulierement dans une clé de la base de registre. et parallelement ton listener java ira lire le contenu de cette clé . L'interaction n'est pas parfaite mais permet d'interagir un minimum.
je ne vois pas trop comment tu pourrais faire pour passser à une interaction C java, puisque JNI comme tu le dit ne permet de faire que l'inverse.
Cependant tu peux créer un petit listener en java qui ira lire les resultat de ta routine en c.
je m'explique tu lance ton prog en c qui ecrira par exemple ses resultat d'avancement regulierement dans une clé de la base de registre. et parallelement ton listener java ira lire le contenu de cette clé . L'interaction n'est pas parfaite mais permet d'interagir un minimum.
Slt
j'ai résolu mon problème en créant une porte (interface) dans mon programme Java : un socket (serveur) qui écoute sur un port donné!
Mon programme C (client) envoie le pourcentage sur le port donné!!!
Voila
Tony
NB :
le programme C est qd meme un programme JNI qui instancie un objet d'une classe Java qui est le programme client.
Au début j'ai eu un problème avec la concordance des types C et Java : l'entier qui été envoyé par ma socket écrit avec l'api winsock de windows ne correspondait pas avec l'entier lu par le serveur!
Voila pourquoi j'ai écrit le client en Java aussi !!
j'ai résolu mon problème en créant une porte (interface) dans mon programme Java : un socket (serveur) qui écoute sur un port donné!
Mon programme C (client) envoie le pourcentage sur le port donné!!!
Voila
Tony
NB :
le programme C est qd meme un programme JNI qui instancie un objet d'une classe Java qui est le programme client.
Au début j'ai eu un problème avec la concordance des types C et Java : l'entier qui été envoyé par ma socket écrit avec l'api winsock de windows ne correspondait pas avec l'entier lu par le serveur!
Voila pourquoi j'ai écrit le client en Java aussi !!