Accéder à l'API Windows à partir d'une application Java-JNI ou JNA? [dupliquer]


Cette question a déjà une réponse ici:

Pour un exercice, je voudrais développer une application en Java qui peut faire des appels à l'API Windows et s'enregistrer pour une notification sur des événements comme une pression sur une touche.

D'après les recherches effectuées précédemment, je comprends que le L'API Windows adaptée à mon besoin est la fonction SetWindowsHookEx .

Certains ont suggéré d'utiliser JNI pour cela, et d'autres JNA. Pour le scénario que j'ai décrit, Quels sont les avantages et les inconvénients de l'utilisation de JNI ou JNA?

J'ai besoin d'avis sur la meilleure façon d'aborder la résolution de ce problème.

Veuillez noter les gars, que je suis conscient que C/C++ serait le plus approprié pour ce que je fais. Mais comme je l'ai dit dès le début-je le fais comme un exercice, et donc je veux l'accomplir en utilisant Java.


Cette question n'est pas un doublon de Appelant la méthode API Win32 à partir de Java, pour les raisons suivantes:

  • Ma question demande, quels sont les avantages et les inconvénients de l'utilisation de JNI ou JNA.
  • Les autres questions demandent
    Comment appeler une DLL déjà existante à partir de Java

Ce ne sont tout simplement pas les mêmes questions.

Author: Community, 2013-01-16

1 answers

Pour l'invocation générale de code natif, JNA a tendance à être beaucoup plus facile, car vous n'avez pas besoin d'écrire un talon C/C++.

Cependant, il n'est pas toujours possible de faire ce dont vous avez besoin via JNA. Permettez-moi d'expliquer pourquoi:

Je pense que pour ce que vous voulez faire, JNI va être nécessaire. Le problème est que SetWindowsHookEx prend des paramètres, y compris un pointeur vers la procédure de hook et un handle vers la DLL qui contient la procédure de hook. Windows utilisera cette information pour appeler le procédure de crochet. Comme vous pouvez l'imaginer, Windows ne pourra pas appeler directement dans une méthode d'un objet dans la JVM.

Donc, je crois que vous allez devoir utiliser JNI pour écrire une dll qui se situera entre votre application java et l'API Windows. Cette dll contiendra le processus de hook réel et invoquera SetWindowsHookEx pour vous. Le processus hook de la dll peut ensuite utiliser JNI pour appeler votre objet java.

 4
Author: GreyBeardedGeek, 2013-01-15 22:10:07