我有一个java应用程序,我需要将一些信息传递给C ++程序。有人建议我使用一些简单的套接字编程来做到这一点。这是最好的方法吗?如果不是什么选择?如果是这样,我应该如何学习套接字编程?
答案 0 :(得分:16)
您有几个选择:
对于学习套接字,Google搜索"java socket tutorial"或"c++ socket tutorial"会为您提供大量信息。
答案 1 :(得分: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
答案 2 :(得分:4)
虽然答案已被接受,但这里的一个关键问题是两种语言之间的语义不匹配:假设您正在进行某种流连接,您如何有效地交换数据?
我可能推荐的一个解决方案是Google Protocol Buffers。它没有解决子进程/ JNI / socket问题,但是它所做的是让你以一种非常有效的方式让一个复杂的对象结构通过流协议传输。
请记住:JNI很复杂,特别是对于复杂的对象引用,但它很有效。最重要的是正确地通过有效的上下文切换传递数据。 GPB + JNI /子进程套接字允许单个上下文切换来提取数据,并结合双方的高效编解码器支持。
答案 3 :(得分:1)
您可以使用Java Native Interface(JNI)。 JNI允许您从Java应用程序调用C库。请注意,JNI调用是C而不是C ++调用,因此您必须在C ++函数上指定C调用约定(extern“C”)。
JNI有一个很难做的名声。这并不容易,但它确实可行。我建议不要使用套接字。使用套接字听起来就像是简单的出路,但对我而言,这无异于打开一堆令人讨厌的蠕虫......
答案 4 :(得分:1)
戴夫提到的选项是一些最常见的方法。
作为JNI解决方案的扩展,如果您想要在Java和C ++之间共享一些原始数据,您还可以查看直接的ByteBuffers(Java 1.4及更高版本)。直接字节缓冲区允许您在C ++或Java端分配一定大小的缓冲区,然后从两种语言轻松访问缓冲区;在Java中,这是通过ByteBuffer对象上的方法完成的,在C ++中,您可以获得指向数据的指针。如果您要交换大量信息并且不希望将其全部作为JNI方法中的参数传递,则ByteBuffers非常方便。
套接字方法可能过度杀伤,但我不确定你特别想要做什么。
答案 5 :(得分:0)
需要更多信息(但这是一个很好的问题)。
这两个独立的程序是否同时运行?
如果没有,并且Java程序需要调用C ++库,那么JNI答案是一个很好的解决方案,但它不会真正适用于各个进程。
在进程的情况下,你确实需要找到一种跨进程进行通信的方法......一个简单的解决方案(可能不是最好的,但我不知道你的确切情况)会有一个二进制文件写入和读取...只是不要忘记提防竞争条件!套接字也可以工作,但是如果你的程序进行了很多通信,那可能会对CPU的功耗有所影响。
答案 6 :(得分:0)
答案 7 :(得分:0)
此外,如果噪音没有丢失,请尝试使用SWIG来帮助您尝试JNI路线。 http://www.swig.org/
答案 8 :(得分:0)
还有SOAP的选项,但假设你只是在同一台机器上有两个进程,这可能有点过头了。为了完整起见,我仍然提到它。