2013-01-15 64 views
3

對於練習,我想開發一個Java應用程序,它可以調用Windows API並註冊自己,以通知按鍵等事件。從Java應用程序訪問Windows API - JNI或JNA?

從前面的研究中,我瞭解到適合我需要的特定Windows API是SetWindowsHookEx函數。

有些人建議使用JNI來做這個,還有其他的JNA。對於我所描述的場景,使用JNI或JNA有什麼優點和缺點?

我需要關於如何最好地解決這個問題的意見。

請注意傢伙,我知道C/C++將最適合我在做什麼。但正如我從一開始就說的那樣 - 我正在做這個練習,因此我想用Java來完成它。


這個問題不是Calling Win32 API method from Java重複,有以下原因:

  • 我的問題問,什麼是使用JNI或JNA的利弊。
  • 的其他問題問
    如何從Java

調用一個已經存在的DLL他們只是不一樣的問題。

+0

我覺得JNA要複雜得多,但我不相信這個問題能夠得到公正的回答。 –

+0

你的問題(2013年)在另一個(2010年)後3年問了。你以前如何看待它? – slfan

+0

我錯過了幾年的差異,因爲我很生氣。無論如何,他們不是基於我列出的其他點的同一問題。 –

回答

4

對於本地代碼的通用調用,JNA往往會容易得多,因爲您不必編寫C/C++存根。

然而,並不總是可以通過JNA來做你需要的。讓我解釋爲什麼:

我認爲,對於你想要做的,JNI將是必需的。 問題是SetWindowsHookEx接受的參數包括一個指向鉤子程序的指針和一個包含鉤子程序的DLL的句柄。 Windows將使用該信息來調用掛鉤過程。正如你可能想象的那樣,Windows無法直接調用JVM中的對象方法。

所以,我相信你將不得不使用JNI來編寫一個dll,它將位於你的java應用程序和Windows API之間。該DLL將包含實際的鉤子進程,並將爲您調用SetWindowsHookEx。然後DLL的鉤子進程可以使用JNI來調用你的java對象。

+3

從JNA的3.5版本開始,支持基於DLL的掛鉤程序,就像添加「DLLCallback」一樣簡單(http://twall.github.com/jna/3.5.1/javadoc/com/sun/ jna/win32/DLLCallback.html)標記接口到您的回調對象。 – technomage

相關問題