IPC entre Java et C++


Mon objectif ici est de faire lire deux applications distinctes (une en Java et l'autre en C++, toutes deux sur la même machine) à partir de la même base de données SQLite. L'implémentation C++ fonctionne déjà et a toutes les méthodes dont j'ai besoin pour cette communication. Il utilise le sqlite3.h les bibliothèques.

La première chose rationnelle à faire serait d'utiliser un JDBC ou un wrapper SQLite dans l'application Java. Le problème est que mon système embarqué (POSIX) a des ressources très limitées et prend très long pour exécuter une requête simple lorsque j'ai inclus le * nécessaire.bocal en elle. J'ai essayé le Xerial JDBC, sqlite4java, sqljet et le pilote Javasqlite Wrapper/JDBC de Christian Werner. Le JavaVM prend juste trop de temps pour tout charger et l'exécuter et les performances sont un problème critique.

Comme solution de contournement, j'ai géré l'application Java pour utiliser les commandes système et exécuter le shell de commande sqlite3 pour exécuter la requête et obtenir la réponse. Je suis à la recherche d'une plus "élégant" et solution sécurisée.

J'ai réellement besoin de l'application Java pour utiliser les méthodes de C++. Ils renvoient simplement une chaîne car les méthodes sont implémentées pour ne renvoyer qu'une seule valeur. Après beaucoup de lecture IPC, je suis arrivé à la conclusion que je dois utiliser des tuyaux nommés. Le fait est que je devrais utiliser JNI mais j'ai un niveau Java débutant et à ce moment-là, JNI est trop complexe pour moi. JNI est-il exagéré dans ce cas?

Quelle autre solution pourrais-je implémenter ici?

Author: Nacao, 2013-09-06

3 answers

Je ne suis pas sûr des performances dont vous avez besoin sur l'IPC, mais il existe plusieurs approches:

  1. utiliser des sockets
  2. utiliser des tuyaux
  3. utilisez memorymappedfiles (en utilisant memorymappedfiles, vous aurez un gain de performance)

Dans les deux cas, vous aurez besoin d'un sérialiseur/désérialiseur pour les objets(données) que vous transmettez de java à c++ et vice-versa.

Selon le format de données, vous pourriez avoir besoin de sérialiseur/désérialiseur uniquement du côté Java. (par exemple, vous envoyez des données binaires que C++ lira sans avoir besoin de le décoder plus). Un bon tutoriel sur la façon d'utiliser memorymapped fichier en java peut être trouvé ici et en C++, vous devez utiliser mmap fonction.

 2
Author: Claudiu, 2013-09-06 08:34:58

Vous pouvez utiliser rasade. Swig peut analyser votre en-tête C/C++ et en générer des clases/fonctions Java. Le code généré a des appels jni pour appeler vos clases c++ ou vos fonctions c.

 0
Author: David Feurle, 2013-09-06 08:45:01

En fait, j'avais tort. Je n'ai pas besoin d'utiliser JNI pour utiliser des tuyaux nommés en Java. J'ai communiqué avec succès ces deux processus en utilisant des techniques de base. En java, je viens d'utiliser FileOutputStream et FileInputStream pour communiquer avec les tuyaux nommés.

Ce lien m'a été particulièrement utile:

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

 0
Author: Nacao, 2015-06-19 10:20:43