2009-01-20 140 views
18

我有一个Java应用程序,我需要将一些信息传递给C++程序。有人建议我使用一些简单的套接字编程来做到这一点。这是最好的方法吗?如果不是什么选择?如果是这样,我应该如何去学习socket编程?将信息从java传递给C++的最佳方式是什么?

回答

16

您有几种选择:

  • 传递从Java文件到C++。这可能是最简单的。这很容易测试,并且不应该在任何一端都需要任何第三方库。
  • 使用上述插座。在C++中,如果您需要跨平台解决方案,像ACEboost这样的库将为您节省一些心疼
  • 使用JNI可以从Java调用到C++,反之亦然。这可能是最困难但最高效的。

对于学习套接字,谷歌搜索"java socket tutorial""c++ socket tutorial"会给你很多的信息。

1

您可以使用Java Native Interface(JNI)。 JNI允许您从Java应用程序调用C库。请注意,JNI调用是C而不是C++调用,因此您必须在C++函数(extern“C”)上指定C调用约定。

JNI有一个很难做的声誉。这并不容易,但它确实可行。我会建议不要使用套接字。使用套接字听起来就像讨巧但对我来说,无异于打开讨厌一罐蠕虫...

+0

我听说过痛饮,但我从来没有使用它。比JNI更容易吗?有谁知道? – OscarRyz 2009-01-20 22:03:02

0

需要更多信息(但一个很好的问题)。

这两个独立的程序是否在同一时间运行?

如果不是,和Java程序需要调用一个C++库,JNI的答案是一个很好的解决方案,但它不会真正跨进程的工作。

在进程的情况下,你真的需要找到一种方法跨越进程进行通信......一个简单的解决方案(可能不是最好的,但我不知道您的具体情况),将有一个二进制文件写入和读取...只是不要忘记提防竞争条件!套接字也可以工作,但是如果你的程序进行了很多通信,那么CPU功耗可能会有点大。

6

一个简单的方法来做到这一点是使用标准的输入和输出:

class MyTest { 
    public static void main(String... args) { 
     System.out.println("carpet"); 
    } 
} // Java 

#include <iostream> 
#include <string> 
int main() { 
    string input; 
    std::getline(std::cin, input); 
    std::cout << "from java: " << input << std::endl; // output: carpet 
} // C++ 

# start by piping java's output to c++'s input 
$ java MyTest | ./my_receive 
1

戴夫提到的选项是一些最常用的方法。

作为扩展到JNI的解决方案,你也可以看看直接字节缓冲区(Java 1.4中和以后),如果你有你想要的Java和C之间共享一些原始数据++。直接字节缓冲区允许您在C++或Java端分配一定大小的缓冲区,然后轻松地从两种语言访问缓冲区;在Java中,这是通过ByteBuffer对象上的方法完成的,并且在C++中可以获得指向数据的指针。如果您有足够的信息进行交换,并且您不希望将它们全部作为JNI方法中的参数传递,则ByteBuffers非常方便。

套接字的方法是可能矫枉过正,但我​​不确定你在做什么。

0

还有SOAP的选项,但这可能是矫枉过正,假设您在同一台机器上只有两个进程。为了完整性,我仍然提到它。

4

虽然答案已被接受,这里的关键问题是两种语言之间的语义不匹配:假设你有某种流连接的事情,你是如何有效地交换数据?

一个解决方案我可能会建议是谷歌协议缓冲器。它不能解决子/ JNI /插座的问题,但它所做的就是让你一个非常有效的方式有通过流协议的复杂对象结构中转。

记住:JNI是复杂的,特别是对复杂对象的引用,但它是有效的。最重要的是通过适当的高效上下文切换传递数据。 GPB + JNI /子流程套接字允许单个上下文切换来拉取数据,并结合双方高效的编解码器支持。

相关问题