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

拥有自己的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代码应该是线程安全的。

有什么建议?

谢谢,

家伙

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

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

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

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

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

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

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

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

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

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

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

  • 不能做很多关于它不是免费的,但无论如何都可能值得你去检查它。

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

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