3

演習として、Windows API を呼び出し、キー押下などのイベントで通知するように登録できるアプリケーションを Java で開発したいと思います。

以前に行った調査から、私のニーズに適した特定の Windows API はSetWindowsHookEx関数であることがわかりました。

これに JNI を使用することを提案する人もいれば、JNA を使用することを提案する人もいます。私が説明したシナリオでは、JNI または JNA を使用することの長所と短所は何ですか?

この問題を解決する最善の方法について意見が必要です。

私がやっていることにはC / C ++が最も適していることを私は知っていることに注意してください。しかし、最初から述べたように、私はこれを演習として行っているため、Java を使用してそれを達成したいと考えています。


この質問は、次の理由により、Java から Win32 API メソッドを呼び出すの複製ではありません。

  • 私の質問は、JNI または JNA を使用することの長所と短所は何ですか。
  • その他の質問
    Java から既存の DLL を呼び出す方法

それらは同じ質問ではありません。

4

1 に答える 1

4

ネイティブコードの汎用呼び出しの場合、C / C ++スタブを作成する必要がないため、JNAの方がはるかに簡単になる傾向があります。

ただし、JNAを介して必要なことを常に実行できるとは限りません。理由を説明しましょう:

あなたがやりたいことには、JNIが必要になると思います。問題は、SetWindowsHookExが、フックプロシージャへのポインタや、フックプロシージャを含むDLLへのハンドルなどのパラメータを受け取ることです。Windowsは、その情報を使用してフックプロシージャを呼び出します。ご想像のとおり、WindowsはJVM内のオブジェクトのメソッドを直接呼び出すことはできません。

したがって、JavaアプリとWindows APIの間に配置されるdllを作成するには、JNIを使​​用する必要があると思います。そのdllには実際のフックプロセスが含まれ、SetWindowsHookExが呼び出されます。dllのフックプロセスは、JNIを使​​用してJavaオブジェクトを呼び出すことができます。

于 2013-01-15T22:10:07.737 に答える