Java 应用程序和 C++ 应用程序集成/通信

Posted

技术标签:

【中文标题】Java 应用程序和 C++ 应用程序集成/通信【英文标题】:Java app & C++ app integration / communication 【发布时间】:2011-07-06 01:18:14 【问题描述】:

我们有两个代码库,一个是用 C++ (MS VS 6) 编写的,另一个是用 Java (JDK 6) 编写的。 寻找创造性的方式让两人互相交谈。


更多详情:

这两个应用程序都是 GUI 应用程序。 不能进行重大改写或翻译。 沟通需要双向。 尽量避免涉及将文件写入磁盘的任何事情。

目前考虑的选项有:

零MG RPC CORBA JNI 将 Java 编译为本机代码,然后链接

基本上,除了最后一项之外,这归结为在各种方式之间进行选择,以实现 Java 应用程序和 C++ 应用程序之间的进程间通信。仍然欢迎其他创意建议!

如果您之前尝试过此操作或类似的操作,请提出您的建议、经验教训、要避免的陷阱等。


毫无疑问,很快就会有人指出,这个问题没有一个正确的答案。我想无论如何我都会利用 SO 社区的集体专业知识,并希望得到许多优秀的答案。

【问题讨论】:

在这种情况下,不希望重写并且您必须编写 JNI 胶水代码,我强烈推荐 considering JNA, and writing the JNA glue-code,它更简单,IMO。 @bguiz:你最近怎么样?有任何建议有帮助吗? 【参考方案1】:

嗯,这取决于您希望这些应用程序的集成程度以及您对它们未来发展的看法。如果您只想在两者之间进行数据通信(例如,您希望一个能够打开另一个写入的文件,或者直接从另一个读取流),那么我会说protocol buffers 是您最好的赌注。如果您希望这些 GUI 应用程序之一呈现的窗口实际嵌入到另一个 GUI 应用程序的面板中,那么您可能希望使用 JNI 方法。使用 JNI 方法,您可以使用 SWIG 自动执行大部分操作,尽管它具有危险的魔力并且带有许多警告(例如,它在函数重载方面表现不佳)。

我强烈建议不要使用 CORBA、RMI 和类似的远程过程调用实现,主要是因为根据我的经验,它们往往非常重量级并且消耗大量资源。如果您确实想要类似于 RMI 的东西,我会建议您在传递消息时使用更轻的重量,而不是实际的对象(就像 RMI 一样)。例如,您可以使用协议缓冲区作为您的消息格式,然后简单地在普通套接字之间来回序列化它们。

Kit Ho 提到了 XML 或 JSON,但协议缓冲区比这两种格式都高效得多,并且还具有直接内置于定义语言中的向后兼容性概念。

【讨论】:

这就是 DDS 的用途(发布/订阅)【参考方案2】:

使用 Jacob (http://sourceforge.net/projects/jacob-project)、JCom (http://sourceforge.net/projects/jcom) 或 j-Interop (http://j-interop.org) 并使用 COM 进行通信。

【讨论】:

+1 @g051051 :感谢您的建议,将调查他们【参考方案3】:

由于您使用的是 Windows,我建议您使用 DDE (Dynamic Data Exchange)。 Java Parts 提供了一个 Java 库。

【讨论】:

+1 @Ben Jaguar Marshall:感谢您的建议,我会调查一下【参考方案4】:

不知道您要传输和交流多少数据以及什么类型的数据。 但为了简化方式,我建议使用基于 HTTP 协议的 XML 或 Json。

由于这两个应用程序都有很多库,您不会花费太多精力来实现和理解。

此外,如果您有其他应用程序可以讨论,这并不难,因为这两种技术都可以。是跨语言的。

如果我错了请纠正我

【讨论】:

以上是关于Java 应用程序和 C++ 应用程序集成/通信的主要内容,如果未能解决你的问题,请参考以下文章

C++ 和 Java 对象通信

WEB UI 前端和 C++ 后端之间的通信?

用于集成测试的 Java 测试项目

互操作性 java 和 c++ [关闭]

互操作性 java 和 c++ [关闭]

使用 Java 在服务器应用程序和 Matlab 客户端之间进行套接字通信