从C#调用我自己的Java代码

时间:2010-01-14 08:50:15

标签: c# java c++ string java-native-interface

拥有自己的Java代码我正在使用C#调用一些非托管代码来调用(通过JNI)java代码。我正在使用JNI,因为我需要确保:

  • Java代码将在真实JVM上运行而不是在某些.NET VM上运行的能力
  • 连接到VM进行调试的能力(IKVM不支持)
  • 我需要免费解决方案
  • 目前的免费解决方案不适用(例如IKVM)

无论如何,我的问题是如何以最佳方式管理在这些层之间传递的字符串而不会泄漏。 我正在做类似的事情:

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

这意味着我正在为托管代码中的响应分配内存。 我想避免这种情况,因为我事先并不知道响应长度。如何编写JNI适当的方法,为托管代码分配正确的缓冲区而不会泄漏。 JNI代码应该是线程安全的。

有什么建议吗?

谢谢,

5 个答案:

答案 0 :(得分:6)

可能需要JNI,但您的要求并未真正表明它。

使用真正的JVM 的要求并未规定使用JNI。我建议提高你的要求,或考虑更松散的耦合。例如,套接字通信,Web服务,共享数据库,共享文件或a queue

如果您真的需要在相同的过程中运行Java和.NET,并且紧密耦合,请考虑JNBridge
他们已经解决了你所面临的问题。

答案 1 :(得分:2)

您可能有兴趣尝试使用IKVM.NET在.NET CIL中转换Java字节码代码。

答案 2 :(得分:1)

您基本上需要从.NET代码远程调用java程序。

使用您当前的技能组合,我建议您在Java机器中创建Web服务 - 这在Java 6中相对容易 - 并且基于WSDL在.NET程序中创建客户端。

这可能是当今技术最干净的解决方案。

如果因某种原因不够好,请添加到您的问题中。

答案 3 :(得分:1)

盖伊 - 关于切索的回应,以及你对它的回应:

  • JNBridgePro允许JVM自动启动并在.NET进程内运行(除了显式启动它之外)。请参阅文档中讨论的“共享内存”通信机制。

  • JNBridgePro允许您附加Java调试器,即使JVM在.NET进程内运行也是如此。有关详细信息,请联系support@jnbridge.com,以及有关配置JVM的详细信息。

  • 关于它不是免费的不能做太多,但无论如何都要花点时间检查一下。

披露:是的,我和JNBridge在一起。

答案 4 :(得分:0)

我认为你可以使用jni4net作为桥库。或者您可以查看源代码并获取一些想法(LGPL / GPL)。