JNI natif -> Java - appeler java depuis une fonction callback??? [Résolu]

Signaler
Messages postés
14
Date d'inscription
dimanche 3 décembre 2000
Statut
Membre
Dernière intervention
10 juillet 2008
-
Messages postés
14
Date d'inscription
dimanche 3 décembre 2000
Statut
Membre
Dernière intervention
10 juillet 2008
-
salu,

Voila j'essaye depuis plusieurs jours deja  de faire remonter à JAVA mes evenements detectés grace aux fameux hook.
Le problème est que je n'arrive à rien depuis les fonctions callback (procedure qui releve les evenements ). aucune variable globale n'est valide.
Ce que je fais actuellement :
- sauvegarde de la JavaVM en variable globale grace à JNI_OnLoad
- utilisation de cette var globale depuis la fonction callback

est ce que quelqu'un a une idée?
A voir également:

7 réponses

Messages postés
966
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
4 mars 2010
4
Il y a toute une série de fonctions associées dans l'API :
SendMessage() // à une fenêtre, attend la réponse
PostThreadMessage() // à un thread , retourne immédiatement
...

Le mieux serait je pense, si tu n'as pas besoin de réponse du programme source, d'utiliser PostThreadMessage(), parce que SendMessage s'adresse à une fenêtre donc si tu n'en n'as pas...
Tu peux définir tes messages personnalisés à partir de WM_USER, par exemple :
#define WM_PERSO_0 (WM_USER+2)
etc...

Par contre du coup dans ton programme source tu devras avoir une boucle de récupération de message.
Je ne sais pas si tu y es familier, dans le cas contraire :

MSG msg;
msg.message=WM_NULL;
while(msg.message!=WM_PERSO_QUIT) // par exemple
{
       GetMessage(&msg,NULL,WM_NULL,WM_NULL);
       switch(msg.message)
      {
            case WM_PERSO_0:
             ...
      }
}
Simple à comprendre : GetMessage() récupère les messages dans la file du thread, et tu boucles tant que tu n'as pas reçu l'ordre de sortir (WM_PERSO_QUIT). Par contre, faudra penser à le donner, cet ordre, depuis ton hook! Par exemple si l'application hookée se termine etc... Bien sûr tu peux mettre n'importe quelle autre condition dans le while à la place du message quitter, genre un temps limite...

La fonction PostThreadMessage() a besoin de l'ID du thread auquel envoyer le message, ce qui veut dire que tu dois lui passer cette information : c'est là qu'intervient CreateFileMapping() et compagnie.
Tu pourras récupérer l'ID du thread de ton programme source, par exemple avant d'installer le hook, par GetCurrentThreadId().

Bon si tu veux un exemple concret j'avais déposé une source de hook sur le notepad, où tu pourras trouver mémoire partagée, hooks et envoi de messages entre callback du hook et programme principal.
http://www.cppfrance.com/codes/PERSONNALISER-APP-CHANGER-COULEUR-POLICE-NOTEPAD_44037.aspx
Il y en a plein d'autres sur le site.
Messages postés
14
Date d'inscription
dimanche 3 décembre 2000
Statut
Membre
Dernière intervention
10 juillet 2008

pas d'idées?
Messages postés
966
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
4 mars 2010
4
Je connais pas du tout Java; cependant si tes hooks sont globaux ou ciblent d'autres processus, il faut savoir que les callbacks seront appelées dans le contexte du (ou des) programme(s) cible(s). Par conséquent il n'y a aucun partage de variables puisque tout se passe dans des espaces d'adressages différents. Si tu veux passer des valeurs entre ton programme source et les hooks, il faut utiliser de la mémoire partagée, par exemple avec l'API Windows CreateFileMapping() et MapViewOfFile().
Messages postés
14
Date d'inscription
dimanche 3 décembre 2000
Statut
Membre
Dernière intervention
10 juillet 2008

ok j'ai deja utilisé cet technique qui marche trés bien en effet pour echanger des données style entier ou caractère .
Par contre lorsque j'essaye de sauvegarder le pointer de la JVM crée et de le faire passer à ma methode callback, ca ne semble pas marcher.
Pourtant j'initialise bien le pointer et quand je suis dans ma fonction callback j'ai  verfiié que  le pointeur est bien different de null mais il semble erroné.
Messages postés
966
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
4 mars 2010
4
en cas de pointeur c'est différent;
un pointeur est valable seulement dans l'espace mémoire dans lequel il a été référencé. Donc tu ne peux pas simplement le passer à une autre application, puisque ce ne sera pas le même contexte et donc la même valeur pointera sur tout à fait autre chose. Tu peux par contre peut-être utiliser ReadProcessMemory(), qui permettra depuis ta callback, à partir du pointeur du processus de base, de lire la mémoire dans le processus de base. Cependant, ceci permet seulement de copier la mémoire dans un nouveau buffer.
Je ne vois pas trop ce que tu veux faire en fait (comme dit j'y connais rien à Java), mais ne serait-il pas plus simple, à partir de la callback, d'envoyer des messages vers le processus source où le traitement serait assuré (parce que du coup tu seras dans le bon espace mémoire)?
Messages postés
14
Date d'inscription
dimanche 3 décembre 2000
Statut
Membre
Dernière intervention
10 juillet 2008

bien joué l'idée des messages !merci de m'aider c cool.
ca pourrait etre une solution, parcontre tu pourrais me dire comment envoyer des messages entre different processus???
il me semble que ca marche avec des SIGNAL mais je suis plus trés sur du fonctionnement

++
Messages postés
14
Date d'inscription
dimanche 3 décembre 2000
Statut
Membre
Dernière intervention
10 juillet 2008

merci mille fois, c la grande classe je pense que ca va le faire!!!!