没有JNI的Java C ++

时间:2010-01-09 22:37:58

标签: java c++ ipc

我的应用程序是用Java编写的。 我需要使用一个C ++库。我不想使用JNI。

每秒60次,C ++应用程序需要向Java应用程序发送10MB数据; Java应用程序需要向C ++应用程序发送10 MB的数据。

两个应用程序都在同一台机器上运行;操作系统是Linux或Mac OS X.

最有效的方法是什么? (目前,我正在考虑TCPIP端口;但在C ++中,我可以进行内存映射 - 我可以在Java中做类似的事情吗?)

谢谢!

6 个答案:

答案 0 :(得分:7)

是的,Java有NIO框架的内存映射文件。

如果您因为不想编写存根而试图避免使用JNI,那么您还可以使用JNA与C ++代码(至少是extern "C")进行交互。为获得最佳性能,请使用直接映射(具有native方法的具体类,而不是映射接口)---有关更多详细信息,请参阅文档。 : - )

答案 1 :(得分:6)

使用映射文件是一种手动滚动高度优化的rpc的方法。您可以考虑从通过本地套接字进行通信的Web服务开始,使用MTOM附加数据,或者只是将其放入文件中。然后你可以测量性能。如果数据有问题,则可以使用映射。

请注意,对此有一些奇怪的限制,使您的代码对是否在Windows上运行敏感。在Windows上,您无法删除已打开的内容。

我应该指出,我已经完成了你在这里提出的建议。它在套接字上有一个控制通道,数据通过一个用C ++(或Windows等价物)映射的文件和用Java映射的NIO共享。有用。但我从未测量过最大吞吐量。

答案 2 :(得分:2)

听起来像共享内存是可行的方法。我相信NIO图书馆支持这一点。

问题是你希望你的程序做什么?

答案 3 :(得分:2)

您应该查看BridJ(和JNAerator)。

它是JNA的最新替代品,支持C ++并且特别注重性能。

答案 4 :(得分:1)

没有直接帮助,至少在开发时会很有趣但你可以使用Java和C ++应用程序都可访问的SSD / RAM驱动器,并且在那里使用基于文件的锁定的数据操作之间有一种兼顾奇怪的东西。

从性能角度来看,这个方案可以管理的是,为此,Java NIO具有ByteBuffer,它是磁盘上低级别字节映射的高级表示。

答案 5 :(得分:0)

你应该看看javolution。 他们使用NIO直接缓冲区进行数据交换。 从理论上讲,这应该比普通的JNI更快 因为你没有传递的开销 数据通过参数列表。