Récupérer événements en C++ sur une fenêtre Java via JNI
PleoX
Messages postés3Date d'inscriptionmercredi 25 juin 2008StatutMembreDernière intervention19 mars 2009
-
18 mars 2009 à 10:58
PleoX
Messages postés3Date d'inscriptionmercredi 25 juin 2008StatutMembreDernière intervention19 mars 2009
-
19 mars 2009 à 13:20
Bonjour,
Je suis en train de créer une application multi-touch. Pour cela, je travaille sur la béta de Windows 7 avec VC6 pour le C++ et eclipse pour Java.
Afin de récupérer tous les événements effectués en multi-touch (zoom, rotation, déplacement), il me faut passer par du C++ (et le SDK de windows 7). J'arrive parfaitement à récupérer ces événements sur une application C++, mais je dois réussir à récupérer ces événements sur une fenêtre Java.
Je voudrais donc créer une DLL à laquelle j'accèderai via JNI afin d'obtenir ces événements. Pour cela, je vois deux solutions :
1 - Créer une Frame en java, la passer à la DLL. La DLL récupèrera ensuite la fenêtre (Frame) et devra l'enregistrer afin de récupérer les événements effectués dessus. (Je pense que cette méthode est réalisable car j'ai trouvé quelques idées sur la page suivante : http://www.javafr.com/codes/FENETRE-RONDE-JNI_38715.aspx)
2 - Créer une fenêtre en C++, l'enregistrer (toujours pour récupérer les événements), puis la passer à Java afin de s'en servir comme une Frame. (Je ne sais pas si cette méthode est réalisable)
Voila, je suis débutant en JNI, je voudrais donc savoir s'il existe d'autres solutions pour mon problème, ou sinon, si une des 2 méthodes est plus performante qu'une autre. Si vous avez des idées, des pistes, ou des tutos, je suis preneur.
Merci
Pleox
A voir également:
Récupérer événements en C++ sur une fenêtre Java via JNI
Twinuts
Messages postés5375Date d'inscriptiondimanche 4 mai 2003StatutModérateurDernière intervention14 juin 2023111 18 mars 2009 à 13:58
Salut,
normalement tu devrais pouvoir faire ce que tu veux avec l'invoke des events java depuis ton code C/C++.
Pour invoquer et initialiser des objets java depuis un code C/C++ inspire toi de ma source sur la récupération des info réseaux ICI ça te donneras surement une idée de comment tu vas faire (en particulier le fichier org_cs_net_x86_NetworkDevices.cpp).
------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."
PleoX
Messages postés3Date d'inscriptionmercredi 25 juin 2008StatutMembreDernière intervention19 mars 2009 19 mars 2009 à 10:19
Bonjour,
Merci beaucoup pour ta réponse. Je vais regarder ça en détail.
Par contre, pour le moment, j'ai opté pour la première solution (j'ai trouvé des sources qui me permette de le faire).
Le soucis, c'est que dans ces sources, on utilise 3 classes : DrawingSurface, DrawingSurfaceInfo et Win32DrawingSurface ; qui appartiennent au package sun.awt qui ne fait plus parti du JDK (celui-ci a été supprimé après le JDK 1.3).
Voici la méthode :
public int getHWND()
{
DrawingSurfaceInfo drawingSurfaceInfo;
Win32DrawingSurface win32DrawingSurface;
int hwnd = 0;
// Get the drawing surface
drawingSurfaceInfo = ((DrawingSurface)(comp.getPeer())).getDrawingSurfaceInfo();
if (null != drawingSurfaceInfo)
{
drawingSurfaceInfo.lock();
// Get the Win32 specific information
win32DrawingSurface = (Win32DrawingSurface) drawingSurfaceInfo.getSurface();
hwnd = win32DrawingSurface.getHWnd();
drawingSurfaceInfo.unlock();
}
return hwnd;
}
Ces sources fonctionnent parfaitement bien sous le JDK 1.3, mais étant donné que je suis sous Windows 7, il est bien entendu impossible que j'utilise cette version (pour cause de non compatibilité).
Je souhaiterais donc savoir s'il est possible d'obtenir le hWnd d'une frame autrement qu'avec cette méthode.
Une des solutions seraient de le faire en C++ (en récupérant le Handle de la Frame envoyé par Java). Mais là aussi je rencontre une erreur lorsque j'essaie de charger le module jawt.dll via la fonction suivante :
GetModuleHandle(TEXT("jawt.dll"));
(Le TEXT permet de convertir la chaine en LPCWSTR.)
Si quelqu'un a une idée pour remplacer la méhode Java par une autre compatible en JDK 1.6 ou si quelqu'un sait comment faire fonctionner la fonction GetModuleHandle...
PleoX
Messages postés3Date d'inscriptionmercredi 25 juin 2008StatutMembreDernière intervention19 mars 2009 19 mars 2009 à 13:20
Re,
Bon, en fait, j'ai trouvé la solution pour mon dernier post.
Finalement, j'ai remplacé la fonction Java getHWND() par l'équivalent en C++. Et j'ai remplacé GetModuleHandle par la fonction LoadLibrary. Cela fonctionne parfaitement.
Je récupère donc tous mes événements, il ne me reste plus qu'à les traiter. Pour cela, je vais utiliser invoke sur les events Java grâce aux sources de twinuts (Merci).