0

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

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

4

3 回答 3

2

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

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

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

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

于 2013-09-06T08:34:58.893 回答
0

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

于 2013-09-06T08:45:01.860 回答
0

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

这个链接对我特别有用:

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

于 2013-09-12T09:37:50.317 回答