這是從Java調用本地庫的最快方式嗎?哪種方法可以從Java訪問本機代碼?
我瞭解的有
- NativeCall - 也就是我們目前正在使用
- JNA - 還沒有使用它,但看起來合理
- JNI - 看起來可怕寫的,但我們如果我們獲得速度,我們會這樣做
這是從Java調用本地庫的最快方式嗎?哪種方法可以從Java訪問本機代碼?
我瞭解的有
Swig也使得JNI更容易。
就速度而言,我懷疑會有微妙的變化 - 我強烈建議你選擇一個你知道你會做很多事情的電話,並對所有提供的解決方案進行基準測試。
JNI是最快的。 JNA與JNI相比非常緩慢(調用開銷可能是一個數量級),但它是一個非常棒的庫,因爲它使本地訪問變得如此簡單。如果你需要偶爾調用一些本地API,JNA非常棒。如果你關心性能,我不會在任何「緊密循環」中使用它。
我不確定NativeCall適合哪些頻譜。
This blog entry聲稱由於JNA使用的內省機制,它會比JNI慢得多。我懷疑NativeCall會使用類似的機制,從而以類似的方式執行。
然而,你應該根據特定對象如果引用和/或Java和C
之間編組我第二SWIG推薦可能的基準。這使得Java/C接口的生活特別容易(更容易)。
JNI不marshall。我不認爲JNA也會這樣做。本機代碼和Java代碼都可以在內存中使用相同的數據。 – erickson 2009-04-08 16:25:43
只有幾個參數會影響編程語言之間接口的性能:JVM運行在什麼設備上,誰開發它(如果它不是通常的Sun JVM),是否需要從本地代碼回調Java代碼,操作系統上JVM的線程模型以及本機代碼的異步性如何...
您可能找不到一個可靠的基準測試,它確切地衡量您需要的東西,恐怕。
Downvoters:請解釋,或downvote是毫無意義的... – 2009-04-08 17:52:53