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

将信息从java传递到c++;? 我有一个java应用程序,我需要把一些信息传递给C++程序。有人建议我使用一些简单的套接字编程来实现这一点。这是最好的方式吗?如果没有,还有什么选择?如果是这样,我应该如何学习套接字编程,java,c++,sockets,cross-platform,Java,C++,Sockets,Cross Platform,您可以使用Java本机接口(JNI)。JNI允许您从Java应用程序调用C库。注意JNI调用是C而不是C++调用,因此您必须在C++函数(Extn)c)上指定C调用约定。 JNI以难做著称。这并不容易,但肯定是可行的。我建议不要使用插座。使用插座听起来很简单,但对我来说,这等于打开一罐讨厌的蠕虫……你有几个选择: 将文件从java传递到C++。这可能是最简单的。它易于测试,两端都不需要任何第三方库 使用上述插座。在C++中,如果需要跨平台的解决方案,比如库或将为您节省一些心痛 用于从爪哇调用C

您可以使用Java本机接口(JNI)。JNI允许您从Java应用程序调用C库。注意JNI调用是C而不是C++调用,因此您必须在C++函数(Extn)c)上指定C调用约定。
JNI以难做著称。这并不容易,但肯定是可行的。我建议不要使用插座。使用插座听起来很简单,但对我来说,这等于打开一罐讨厌的蠕虫……

你有几个选择:

  • 将文件从java传递到C++。这可能是最简单的。它易于测试,两端都不需要任何第三方库
  • 使用上述插座。在C++中,如果需要跨平台的解决方案,比如库或将为您节省一些心痛
  • 用于从爪哇调用C++,反之亦然。这可能是最困难的,但也是最有效的
对于学习sockets,谷歌搜索或将为您提供大量信息。

需要更多信息(但这是一个好问题)

这两个独立的程序是否同时运行

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


在进程的情况下,您确实需要找到一种跨进程通信的方法…一个简单的解决方案(可能不是最好的,但我不知道您的确切情况)是有一个二进制文件,可以写入和读取…只是不要忘了注意争用条件!套接字也可以工作,但如果您的程序进行大量通信,可能会占用CPU电源。

一种简单的方法是使用标准输入和输出:

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 
classmytest{
公共静态void main(字符串…参数){
系统输出打印(“地毯”);
}
}//Java
#包括
#包括
int main(){
字符串输入;
std::getline(std::cin,输入);

Dave提到的选项是一些最常见的方法

作为JNI解决方案的扩展,您还可以查看DirectByteBuffers(Java1.4及更高版本)在java和C++ C++中,如果有一些原始数据,那么直接字节缓冲区就可以在C++或java方面分配一些大小的缓冲区,然后轻松地从两种语言访问缓冲区;在java中,这是通过字节缓冲对象上的方法完成的,而C++中可以得到一个指向数据的指针。如果您有相当数量的信息要交换,并且不想在JNI方法中将其全部作为参数传递,那么这种方法非常方便


socket方法可能有些过分,但我不确定您具体想做什么。

此外,如果这没有在噪音中丢失,那么如果您尝试JNI路线,请使用SWIG来帮助您。

也可以选择,但如果您在同一台机器上有两个进程,那么这可能是过分的。不过,我还是为了方便起见而提到它完整性。

尽管答案已被接受,但这里的一个关键问题是两种语言之间的语义不匹配:假设您有某种流连接,如何有效地交换数据

我推荐的一种解决方案是Google协议缓冲区。它不能解决subprocess/JNI/socket问题,但它所做的是允许您以非常有效的方式通过流协议传输复杂的对象结构


记住:JNI是复杂的,特别是对于复杂的对象引用,但它是高效的。最重要的是通过有效的上下文切换正确地传递数据。GPB+JNI/子进程套接字允许一个上下文切换将数据拉过来,并在两侧加上高效的编解码器支持。

我听说过SWIG,但我有永远不要使用它。它比JNI容易吗?有人知道吗?