Java C++无需JNI

7
我的应用程序是用Java编写的。 有一个C++库我需要利用。我不想使用JNI。
每秒钟60次,C++应用程序需要向Java应用程序发送10MB的数据;而Java应用程序需要向C++应用程序发送10MB的数据。
两个应用程序都在同一台机器上运行;操作系统可以是Linux或Mac OS X。
最有效的方法是什么?(目前,我正在考虑使用TCPIP端口;但是在C++中,我可以进行内存映射--在Java中我可以做类似的事情吗?)
谢谢!

6
您说的是每秒1.2GB的数据传输……您确定您的数字没错吗?这接近于服务器内存带宽可承受的重要部分。 - skaffman
2
是的,http://java.sun.com/javase/6/docs/api/java/nio/channels/FileChannel.html#map%28java.nio.channels.FileChannel.MapMode,%20long,%20long%29 - Logan Capaldo
1
这是一个物理模拟器与图形渲染引擎交互的过程。数字没有错误。 - anon
1
数字可能不会出错,但我认为@skaffman的意思是这样的数据传输速率可能是无法实现的,甚至在除了数据传输之外还有其他事情发生的机器上也可能是物理上不可能的。 - Stephen C
看一下 JNA https://github.com/java-native-access/jna - koders
6个回答

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

1
JNA只是JNI的一个包装器。 - bmargulies
2
是的 - 我刚刚编辑了我的问题,如果OP想要避免编写存根而避免使用JNI,那么JNA是一个很好的选择(因为它会为您处理存根)。 - C. K. Young
我想避免使用JNI以避免不稳定。我不相信C++库没有漏洞,也不希望它破坏我的Java虚拟机。 - anon
因此,使用Java NIO的想法是C++和Java NIO内存映射相同的文件,然后它们通过此文件进行通信?锁定由某些外部源(例如TCP/IP)完成? - anon

6
使用映射文件是手动编写高度优化的rpc的一种方法。您可以考虑从使用本地套接字进行通信的Web服务开始,使用MTOM附加数据,或将其直接放入文件中。然后您可以测量性能。如果数据成为问题,则可以使用映射。
请注意,这方面存在一些奇怪的限制,使得您的代码对于它是否在Windows上运行非常敏感。在Windows上,您无法删除正在打开的内容。
我应该指出,我已经完全按照您在这里提出的建议做过。它有一个控制通道在套接字上,并且数据通过在C ++(或Windows等效物)中进行mmapped并在Java中进行NIO映射来共享。它有效。但我从未测量过最大吞吐量。

2
听起来共享内存可能是一个好的选择。我相信NIO库支持这个功能。
问题是你想让你的程序做什么?

2
你应该看一下BridJ(和JNAerator)。
这是一个最近的替代方案,支持C++并专注于性能。

1

这并不是直接有帮助的,但至少会很有趣去开发。你可以加入一个SSD/RAM驱动器,让Java和C++应用程序都能够访问,并在其中进行数据操作的协调,使用基于文件的锁定等奇怪的东西。

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


0
你应该看一下Javolution。他们使用NIO直接缓冲区进行数据交换。理论上,这应该比纯JNI更快,因为你不需要通过参数列表传递数据的开销。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接