Java和C ++之间的IPC

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

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

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

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

我可以在这里实施哪些其他解决方案

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

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

无论哪种情况,您都需要一个序列化器/反序列化器,用于从java传递给c ++的对象(数据),反之亦然。

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

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

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

这个链接对我特别有用:

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