2011-06-07 107 views
3

我們的編程模型是這樣的:從C代碼調用Java

C代碼是捕捉系統的實時事件(很頻繁)和Java代碼運行的服務器來接收請求。當有一個由c代碼捕獲的事件時,我們需要發送請求到java代碼並等待回覆。我已經嘗試JNI從c調用java,但它看起來會運行幾秒鐘後卡住。 JNI需要初始化jvm並在類文件中搜索處理程序。有沒有更好的方法在c和java之間進行通信?我可以將java代碼編譯爲二進制文件並將其與c代碼鏈接起來嗎? 感謝

回答

3

如果涉及到一個很好的生產者 - 客戶端/消費者 - 服務器範例,您可能需要查看使用套接字。這樣C代碼就在後臺運行,並通過套接字連接將信息推送到Java服務,並且Java服務輪流將答覆發送回C代碼。您還可以考慮使用FIFO或命名管道進行通信,但是至少在本地機器上的套接字在大多數平臺上往往非常快速和高效。

此外,如果您需要以這種方式工作,Java服務可以啓動啓動C代碼,反之亦然(即C代碼可以分離虛擬機並啓動Java服務) 。

1

如果Java代碼運行的服務器,你應該向它發送一個請求的C代碼,它可以在不同的進程,甚至在不同的機器。我個人不會試圖直接從C代碼調用Java代碼,除非有真正的真正的原因。

1

一種選擇是在單獨的進程中運行Java應用程序,並使用java應用程序和C數據收集器之間的進程間通信。關於編譯Java和鏈接到C,如果你的特定工具集支持它,這是可能的。例如,如果使用全功能的GNU編譯器,gcc和gcj可以一起工作,但是您需要了解Java不僅僅是一種語言,它也是一種環境。進行本地Java編譯可能無法爲您提供任何使用Java的系統原因。