Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从C调用我自己的Java代码#_C#_Java_C++_String_Java Native Interface - Fatal编程技术网

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

C# 从C调用我自己的Java代码#,c#,java,c++,string,java-native-interface,C#,Java,C++,String,Java Native Interface,有了自己的Java代码,我使用C#调用一些非托管代码(通过JNI)调用Java代码。我使用JNI是因为我需要确保: Java代码能够在真实的JVM上运行,而不是在某些.NET虚拟机上运行 连接到VM进行调试的能力(IKVM不支持) 我需要免费的解决方案 当前的免费解决方案不适用(例如IKVM) 无论如何,我的问题是如何以最佳方式管理这些层之间传递的字符串而不泄漏。 我在做一些事情,比如: [DllImport(@"MyDll.dll")] public extern static void

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

  • Java代码能够在真实的JVM上运行,而不是在某些.NET虚拟机上运行
  • 连接到VM进行调试的能力(IKVM不支持)
  • 我需要免费的解决方案
  • 当前的免费解决方案不适用(例如IKVM)
无论如何,我的问题是如何以最佳方式管理这些层之间传递的字符串而不泄漏。 我在做一些事情,比如:

[DllImport(@"MyDll.dll")]
public extern static void receive_message(string receDest, StringBuilder response);
这意味着我正在为托管代码中的响应分配内存。 我想避免这种情况,因为我事先不知道响应长度。如何编写一个适合JNI的方法,为托管代码分配正确的缓冲区而不发生泄漏。JNI代码应该是线程安全的

有什么建议吗

谢谢

Guy

您可能需要JNI,但您的需求并没有真正表明这一点

使用真实JVM的要求并不要求使用JNI。我建议您提高要求,或者考虑更宽松的耦合。例如,套接字通信、web服务、共享数据库、共享文件或

如果您确实需要java和.NET在同一进程中运行,请使用紧耦合,请考虑。


他们已经解决了你面临的问题

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

您基本上需要从.NET代码对Java程序进行远程调用

根据您目前的技能,我建议您在Java机器中创建一个web服务—这在Java 6中相对容易—并基于WSDL在您的.NET程序中创建一个客户机

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

如果出于某种原因,这还不够好,那就添加到您的问题中。

我认为您可以将其用作桥梁库。或者,你可以看看源代码,然后抓住一些想法(LGPL/GPL)。

盖伊——关于奇索的反应,以及你对它的反应:

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

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

  • 虽然它不是免费的,但你还是值得去看看它


披露:是的,我是JNBridge的。

1。JNBridge不是免费的。2.我不明白如何配置JVM。3.在他们的示例中,您需要自己加载JVM(直接调用java)谢谢,我知道JNI不是免费的。我不认为这是一项要求。您的时间值多少?+1建议通过使用套接字在两个进程之间通信来保持简单。这不是一个选项,因为:1。我需要java代码是java的,我需要调试它。2.除了“真正的”JVM(不是IKVM),我不想在VM上运行。谢谢,伙计