【问题标题】:IPC between Java and C++Java 和 C++ 之间的 IPC
【发布时间】:2013-09-06 08:27:26
【问题描述】:

我的目标是让两个独立的应用程序(一个使用 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 是不是有点矫枉过正?

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

【问题讨论】:

标签: java c++ sqlite ipc


【解决方案1】:

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

  1. 使用套接字
  2. 使用管道
  3. 使用 memorymappedfiles(使用 memorymappedfiles 您将获得性能提升)

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

根据数据格式,您可能仅在 Java 端需要序列化器/反序列化器。 (例如,您发送 C++ 无需再解码即可读取的二进制数据)。可以在here 找到一个关于如何在 java 中使用 memorymapped 文件的好教程,在 C++ 中你需要使用 mmap 函数。

【讨论】:

    【解决方案2】:

    您可以使用swig。 Swig 可以解析你的 C/C++ 头文件并生成它的 Java 类/函数。生成的代码有 jni 调用来调用你的 c++ 类或你的 c 函数。

    【讨论】:

    • 我去看看。没听说过,但听起来很有趣。
    【解决方案3】:

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

    这个链接对我特别有用:

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

    【讨论】:

      猜你喜欢
      • 2011-09-04
      • 1970-01-01
      • 1970-01-01
      • 2010-12-14
      • 2013-01-29
      • 1970-01-01
      • 1970-01-01
      • 2010-09-15
      • 2011-03-22
      相关资源
      最近更新 更多