2010-01-14 69 views
2

擁有自己的Java代碼我正在使用C#調用一些調用(通過JNI)java代碼的非託管代碼。我使用JNI,因爲我需要確保:從C#調用我自己的Java代碼#

  • 的Java代碼將在真正的JVM上運行的能力,而不是在一些.NET VM
  • 來連接到虛擬機進行調試的能力(IKVM做「NT支持)
  • 我需要免費的解決方案
  • 目前的免費解決方案並不適用(例如IKVM)

不管怎樣,我的問題是如何管理的最佳方式,這些層之間傳遞的字符串沒有泄漏。 我做這樣的事情:

[DllImport(@"MyDll.dll")] 
public extern static void receive_message(string receDest, StringBuilder response); 

這意味着我分配在託管代碼響應的內存。 我想避免這種情況,因爲我事先不知道響應的長度。我該如何編寫一個適當的方法來爲託管代碼分配正確的緩衝區而不會泄漏。 JNI代碼應該是線程安全的。

有什麼建議嗎?

感謝,

蓋伊

回答

6

可能需要JNI,但是你的要求真的不表明它。

要求到使用真正的JVM並不指定使用JNI。我建議提高你的要求,或考慮寬鬆的耦合。例如,套接字通信,Web服務,共享數據庫,共享文件或a queue

如果您確實需要Java和.NET以相同的過程運行,並且耦合緊密,請考慮JNBridge
他們已經解決了您遇到的問題。

+0

1. JNBridge不是免費的。 2.我不明白我如何配置JVM。 3.在他們的示例中,您需要自己加載JVM(直接調用java) 謝謝, Guy – Guy 2010-01-14 09:08:00

+1

我知道JNI不是免費的。沒有看到這是一項要求。你的時間值多少錢? – Cheeso 2010-01-14 09:41:00

+2

+1,建議通過使用套接字在兩個進程之間進行通信來保持它簡單。 – Mark 2010-01-14 09:53:19

2

您可能有興趣嘗試將.NET CIL中的Java字節碼轉換爲IKVM.NET

+0

這不是一個選項,因爲: 1.我需要java代碼在java中,我需要調試它。 2.我不想在「真正的」JVM(不是IKVM)上運行虛擬機 謝謝, Guy – Guy 2010-01-14 09:19:44

1

你基本上需要從你的.NET代碼中對Java程序進行遠程調用。

使用您當前的技能組,我建議您在Java機器中創建一個Web服務 - 這在Java 6中相對容易 - 並且基於WSDL在.NET程序中創建一個客戶機。

這可能是現今技術最乾淨的解決方案。

如果由於某種原因不夠好,然後添加到您的問題。

0

我想你可以使用jni4net作爲橋樑庫。或者您可以查看源代碼並獲取一些想法(LGPL/GPL)。

1

蓋伊 - 關於Cheeso的反應,你的階躍響應它:

  • 的JNBridgePro確實允許JVM將自動啓動,並在.NET進程中運行(除明確啓動它的選項)。請參閱文檔中討論的「共享內存」通信機制。

  • 即使JVM在.NET進程中運行,JNBridgePro也允許您附加Java調試器。有關詳細信息,請聯繫[email protected]以及有關配置JVM的詳細信息。

  • 不能做太多關於它不是免費的,但它可能是值得的,而無論如何檢查它。

披露:是的,我與JNBridge。