爪哇和C++之间的IPC

IPC between Java and C++

本文关键字:IPC 之间 C++      更新时间:2023-10-16

我的目标是让两个独立的应用程序(一个在Java中,另一个在C++中,都在同一台机器上)从同一个SQLite数据库中读取。C++实现已经有效,并且具有该通信所需的所有方法。它使用 sqlite3.h 库。

第一个合理的做法是在Java应用程序中使用JDBC或SQLite包装器。问题是我的嵌入式系统(POSIX)的资源非常有限,当我包含必要的*.jar时,执行一个简单的查询需要很长时间。我已经尝试了Christian Werner的Xerial JDBC,sqlite4java,sqljet和Javasqlite Wrapper/JDBC驱动程序。JavaVM 加载和执行所有内容需要太长时间,性能是一个关键问题。

作为一种解决方法,我已经管理 Java 应用程序以使用系统命令并运行 sqlite3 命令外壳来执行查询并获取答案。我正在寻找一种更"时尚"和安全的解决方案。

我实际上需要 Java 应用程序来使用这些 C++ 中的方法。它们只返回一个字符串,因为实现方法只返回一个值。经过大量的IPC阅读,我得出的结论是我必须使用命名的管道。问题是我必须使用 JNI,但我有一个初学者 Java 级别,到这个时候,JNI 对我来说太复杂了。在这种情况下,JNI 是否矫枉过正?

我可以在这里实施什么其他解决方案?

不确定您需要的IPC性能,但有几种方法:

  1. 使用套接字
  2. 使用管道
  3. 使用内存映射文件
  4. (使用内存映射文件,您将获得性能提升)

在任何一种情况下,您都需要一个序列化程序/反序列化程序来处理从java传递到c ++的对象(数据),反之亦然。

根据数据格式,您可能只需要在 Java 端使用序列化程序/反序列化程序。(例如,您发送C++将读取的二进制数据,而无需再对其进行解码)。关于如何在java中使用memorymap文件的好教程可以在这里找到,C++你需要使用mmap函数。

你可以使用swig。Swig 可以解析你的 C/C++ 标头并生成它的 Java 分支/函数。生成的代码具有 jni 调用来调用 c++ 分支或 c 函数。

其实我错了。我不需要使用 JNI 来使用 Java 中的命名管道。我已经使用基本技术成功地传达了这两个过程。在java中,我刚刚使用FileOutputStream和FileInputStream与命名管道进行通信。

这个链接对我特别有用:

http://carminedimascio.com/2014/01/named-pipes-with-java/