我有一个Java应用程序,我需要将一些信息传递给C++程序。有人建议我使用一些简单的套接字编程来做到这一点。这是最好的方法吗?如果不是什么选择?如果是这样,我应该如何去学习socket编程?将信息从java传递给C++的最佳方式是什么?
回答
您有几种选择:
- 传递从Java文件到C++。这可能是最简单的。这很容易测试,并且不应该在任何一端都需要任何第三方库。
- 使用上述插座。在C++中,如果您需要跨平台解决方案,像ACE或boost这样的库将为您节省一些心疼
- 使用JNI可以从Java调用到C++,反之亦然。这可能是最困难但最高效的。
对于学习套接字,谷歌搜索"java socket tutorial"或"c++ socket tutorial"会给你很多的信息。
您可以使用Java Native Interface(JNI)。 JNI允许您从Java应用程序调用C库。请注意,JNI调用是C而不是C++调用,因此您必须在C++函数(extern“C”)上指定C调用约定。
JNI有一个很难做的声誉。这并不容易,但它确实可行。我会建议不要使用套接字。使用套接字听起来就像讨巧但对我来说,无异于打开讨厌一罐蠕虫...
需要更多信息(但一个很好的问题)。
这两个独立的程序是否在同一时间运行?
如果不是,和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
戴夫提到的选项是一些最常用的方法。
作为扩展到JNI的解决方案,你也可以看看直接字节缓冲区(Java 1.4中和以后),如果你有你想要的Java和C之间共享一些原始数据++。直接字节缓冲区允许您在C++或Java端分配一定大小的缓冲区,然后轻松地从两种语言访问缓冲区;在Java中,这是通过ByteBuffer对象上的方法完成的,并且在C++中可以获得指向数据的指针。如果您有足够的信息进行交换,并且您不希望将它们全部作为JNI方法中的参数传递,则ByteBuffers非常方便。
套接字的方法是可能矫枉过正,但我不确定你在做什么。
而且,如果这不是在噪声丢失,使用SWIG来帮你,如果你尝试JNI路线。 http://www.swig.org/
还有SOAP的选项,但这可能是矫枉过正,假设您在同一台机器上只有两个进程。为了完整性,我仍然提到它。
虽然答案已被接受,这里的关键问题是两种语言之间的语义不匹配:假设你有某种流连接的事情,你是如何有效地交换数据?
一个解决方案我可能会建议是谷歌协议缓冲器。它不能解决子/ JNI /插座的问题,但它所做的就是让你一个非常有效的方式有通过流协议的复杂对象结构中转。
记住:JNI是复杂的,特别是对复杂对象的引用,但它是有效的。最重要的是通过适当的高效上下文切换传递数据。 GPB + JNI /子流程套接字允许单个上下文切换来拉取数据,并结合双方高效的编解码器支持。
- 1. 将值从html页面传递给java类的最佳方式是什么?
- 2. 将值传递给模态的最佳方式是什么?
- 3. 将JS/css信息传递给表单的最佳方法
- 4. 将字符串从C传递给Ada的最佳方式
- 5. 什么是将特定参数传递给方法的最佳方式
- 6. 在Symfony中将变量传递给layout.php的最佳方式是什么?
- 7. 将值传递给不同视图的最佳方式是什么?
- 8. 将回调函数传递给std :: map的最佳方式是什么?
- 9. 将多个查询参数传递给restful api的最佳方式是什么?
- 10. 什么是最好的方法将信息从一个孩子传递给C#中的父对象#
- 11. 在快捷方式将信息传递给一个C#的.exe
- 12. 将C#变量传递给JS的最佳方式
- 13. 什么是推迟信息的最佳方式?
- 14. 什么是在Android中显示信息的最佳方式
- 15. 在多列中展示信息的最佳方式是什么?
- 16. 什么是将数组从jade传递到节点js的最佳方式
- 17. 将信息显示到ListFragment的最佳方法是什么?
- 18. 处理传入短信的最佳方式是什么?
- 19. Adobe flex与Java通信的最佳方式是什么?
- 20. 通过segue传递子类的最佳方式是什么?
- 21. 将对象传递给NodeJS中的子文件的最佳方法是什么?
- 22. 将信息传递给jqModal
- 23. 将结构严密的信息传递给WCF方法。最佳实践
- 24. 将瓶子变量直接传递给vue的最佳方法是什么?
- 25. 在asp.net中将流pdf传递给HttpHandler的最佳方法是什么?
- 26. 将变量传递给Woocommerce产品的最佳方法是什么?
- 27. 使用Java传输文件的最佳方式是什么?
- 28. 将变量值从服务器传递给JavaScript的最佳做法是什么?
- 29. 在Winforms C#中的GUI之间传递变量的最佳方式是什么?
- 30. 将您介绍给项目的最佳方式是什么?
我听说过痛饮,但我从来没有使用它。比JNI更容易吗?有谁知道? – OscarRyz 2009-01-20 22:03:02