2010-01-14 30 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。