2010-09-20 68 views
1

我需要從Java類中調用一個在C中實現的RPC客戶端。JNI或Runtime.exec()?

交互只是一種方式(即)Java必須在C中調用特定函數,而C不需要將任何內容返回給調用Java代碼。

有人可以解釋我的優點&缺點使用任何類型(JNI/Runtime.exec)?哪個是我的情況最好的選擇?

回答

1

Runtime.exec()將爲每個調用啓動一個單獨的進程。你的Java調用者需要消耗每個進程的輸出。

JNI需要一個本地動態鏈接庫。根據您的操作系統,您可能需要明確導出功能。您將使用「native」方法定義Java類,使用javah生成C頭文件/存根文件,並通過調用C客戶端函數來實現本地方法。

Runtime.exec()可能會消耗最多的資源。我個人會使用進程內調用本地代碼。

相反JNI的,可以考慮使用JNA,它可以很容易地從Java調用C函數沒有特設本地膠層。您的C函數需要位於本地動態鏈接庫中。在Java中,您聲明其簽名,加載庫並調用函數。

對於Windows DLL,請注意您需要導出函數以使它們可以從DLL之外使用。

+0

嗨安迪,你能解釋一下速度,內存和系統穩定性嗎?如果您沒有測試指標,任何意見也是受歡迎的。 – saurabheights 2017-01-12 10:29:15

+1

@saurabheights - 我懷疑,但沒有在多個平臺上測試過,與在現有流程中調用本地方法相比,啓動新流程花費的時間和空間更多。前者需要做大部分後者的工作,另外還要創建並銷燬一個新的流程 - 針對每個呼叫。這可以通過創建一個子進程*來改善,並對其進行管道命令。但是,只需使用一個使用JNA或JNI的進程就可以構建更簡單的體系結構。另見[這個答案](http://stackoverflow.com/questions/7699020/what-makes-jni-calls-slow/7809300#7809300)。 – 2017-01-12 21:43:00

+0

非常感謝,分享的答案很棒,還有IBM的文章。 +1。 :) – saurabheights 2017-01-13 05:15:39