IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Java Discussion :

Coupler Java et C


Sujet :

Java

  1. #1
    Membre confirmé Avatar de khallou2007
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    111
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mars 2008
    Messages : 111
    Par défaut Coupler Java et C
    Bonjour,

    Je m'en doute que je postule mon problème dans le topic adéquat, mais je laisse au responsables de le rediriger vers le bon en cas où je me suis trompé.

    Je travaille avec deux logiciels STORM et ATMI développé en java et C respectivement. (ils ne sont pas connue, sauf pour le monde de recherche et pour des spécialités très précis).
    le travaille au première temps était de générer un fichier de sortie par Storm et l’intégrer avec ATMI pour faire des calculs sur ce dernière et régénérer un autre fichier; alors c'est simple en java j'ai utilisé FileWriter.. et dans ATMI je fais une lecture simple des donnée (fopen..;sscanf..;conversion des données), et je fais mes calculs.

    Le problème actuellement c'est au lieu de faire ça hors ligne (attendre la simulation du première logiciel terminera pour lancer ATMI avec le fichier généré), je voulais le faire au fur et à mesure c'est à dire couplé les deux logiciel et au lieu d'avoir un fichier de sortie, les valeurs calculer dans STORM seront injecté instantanément dans ATMI et ce dernière retourne la résultat de calcule pour que STORM l'utiliseras dans la prochaine step, de calcule.

    J'espère que mon problème est un peu claire, et à votre avis c'est faisable?
    si oui, comment je peux procéder?

    Merci d'avance pour toutes suggestions
    bien cordialement.

  2. #2
    Membre chevronné
    Avatar de argoet
    Inscrit en
    Mai 2002
    Messages
    582
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 582
    Par défaut
    Sous Linux / Unix : Vous pouvez par exemple , tous simplement travaillé avec un "pipe"

    Le fichier en Sortie coté Storm est le pipe (Considéré aussi comme un fichier)
    et idem pour ATMI en entrée .
    Il faudra , bien sur , "flush-é" la sortie après chaque Ecriture pour prise en compte par "ATMI"

    Les 2 Programmes fonctionnent simultanément , l'un utilisant les données générés par l'autre "via votre pipe"

  3. #3
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2004
    Messages
    1 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 184
    Par défaut
    1 ère Possibilité
    ---------------
    Il y a surement mieux, mais tu peux le faire avec des Sockets.
    Du réseau en fait, même si t'es sur la même machine.


    1 - STORM fait son boulot
    2 - ATMI écoute sur le port XXX
    3 - STORM a fini et envoie son résultat à ATMI et se met en attente.
    4 - ATMI calcule, et retourne le résultat à STROM
    5 - STORM utilise le résultat reçu.

    Bien-sur ça implique que tu puisse modifier les 2 logiciels.


    2 ème Possibilité
    ---------------
    Si ATMI fourni des libs de calcul, tu peux utiliser JNI pour utiliser directement ces libs dans java.

  4. #4
    Membre confirmé Avatar de khallou2007
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    111
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mars 2008
    Messages : 111
    Par défaut
    @argoet: merci pour l'idée, je tavaille souvent avec le "pipe" sous linux mais je connais pas:
    , "flush-é" la sortie après chaque Ecriture
    et ca donne les résultats souhaité?, je donne un exemple
    si la première sortie de STORM est la valeur '15' ATMI la récupère et fait son calcule (par exemple 15*2) et retourne la valeur 30 à Storm pour qu'il génère la deuxième résultat à partir de cette valeur.

    @Mathieu.J: deux bonne idée (avec l'idée de argoet)!!
    je regarde avec les socket malgré que je suis un peu loin du réseau..
    et la deuxième possibilité, ça veut dire quoi
    Si ATMI fourni des libs de calcul
    Merci !!

  5. #5
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2004
    Messages
    1 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 184
    Par défaut
    Beh si les fonctions de calcul sont disponibles dans des .so (ou des .dll pour windows). CA te permettrait d'exécuter des fonctions de calcul en C depuis Java par exemple.

  6. #6
    Membre chevronné
    Avatar de argoet
    Inscrit en
    Mai 2002
    Messages
    582
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 582
    Par défaut
    Citation Envoyé par khallou2007 Voir le message
    et ca donne les résultats souhaité?, je donne un exemple
    si la première sortie de STORM est la valeur '15' ATMI la récupère et fait son calcule (par exemple 15*2) et retourne la valeur 30 à Storm pour qu'il génère la deuxième résultat à partir de cette valeur.
    Ooops !! Pas vraiment
    Si vous voulez faire cela : il faut alors travailler avec un 2eme Pipe Qui sera La Sortie de ATMI et L'entree de STORM

  7. #7
    Membre confirmé Avatar de khallou2007
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    111
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mars 2008
    Messages : 111
    Par défaut
    Beh si les fonctions de calcul sont disponibles dans des .so (ou des .dll pour windows). CA te permettrait d'exécuter des fonctions de calcul en C depuis Java par exemple.
    bon les calculs son un peu compliqué..il utilise des librairies externe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #include <stdlib.h>
    #include <stdio.h>
    #include <math.h>
    #include <gsl/gsl_errno.h>
    #include <gsl/gsl_integration.h>
    #include <gsl/gsl_spline.h>
    #include <gsl/gsl_fft_complex.h>
    #include "atmi.h"
    mais est ce que je peux générer moi même des .so ?? à partir du .c ?

  8. #8
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2004
    Messages
    1 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 184
    Par défaut
    Oui. Voir avec les experts C pour ça

  9. #9
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Pour chainer les programmes, on utilise simplement les entrées / sorties standard.

    Le programme 1 (en java) au lieu d'écrire dans un fichier va écrire dans le flux System.out, tous simplement.

    Le programme 2 (en C) au lieu de lire un fichier devra lire depuis le stdin

    Ensuite, tu exécute tout ça en shell via la commande

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    java -jar programme1.jar | ./programme2EnC

  10. #10
    Membre confirmé Avatar de khallou2007
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    111
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mars 2008
    Messages : 111
    Par défaut
    Bonjour,
    Merci @tchize_
    selon vous il me faut alors deux pipe (comme a dit argoet)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    java -jar programme1.jar | ./programme2EnC | java -jar programme1.jar
    car j'ai besoin de la sortie du programme2EnC pour la réinjecter dans programme1.

  11. #11
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    attention que tu as trois programmes là! Si tu as besoin de la sortie de programme 2 dans le 1, il faut travailler autrement.

    C'est programme 1 lui même qui devra lancer programme 2. Il passera à programme 2, via le stdin de programme 2, les données à traiter et les récupèrera via le stdout de programme 2 les données traitées.

    Le principe de fonctionnement restant le même stdin/stdout étant des handles de fichiers standards


    Du coté java, c'est la classe ProcessBuilder qui te servira à lancer ces process.

  12. #12
    Membre confirmé Avatar de khallou2007
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    111
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mars 2008
    Messages : 111
    Par défaut
    J'ai réussi à faire la première sens de transfert:
    programme1->programme2EnC
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    java -jar programme1.jar | ./programme2EnC
    comme vous m'avez dit en faisant une lecture via stdin
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char buffer[1024];
     while (fgets(buffer, sizeof buffer, stdin) != NULL) 
     	 {
    Le principe de fonctionnement restant le même stdin/stdout étant des handles de fichiers standards
    c'est à dire modifier le programme1 en lisant la sortie stdout de programme2 avec ProcessBuilder? et pas rediriger avec une simple deuxième "pipe"?

    Merci d'avance

  13. #13
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    non modifier programme 1 avec process builder pour que ce soit lui qui le lance (et pas le shell). Du coup il a le controlle sur les stdin/stdout de programme 2 et sais les utiliser pour envoyer / lire des données. Bref tu aura

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    java -jar programme1.jar
    et dans ton code java quelque part

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ProcessBuilder pb = new ProcessBuilder("./programme2EnC","parametre1","parametre2",...)
    Process p = pb.start();
    // dans un thread n°1, envoyer les données via p.getOutputStream().write(...)
    // dans un thread n°2, lire la réponse via p.getInputStream().read(...)
    // dans un thread n°3, lire les erreurs via p.getErrorStream().read(...)
    // et dans le thread principal, on attends que tout soit finis :)
    p.waitFor();

  14. #14
    Membre confirmé Avatar de khallou2007
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    111
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mars 2008
    Messages : 111
    Par défaut
    un retour avec un peu de retard!!
    PROBLÈME RESOLU!!!!
    Je vous en remercie !
    j'ai fais comme a dit tchize_ sauf que la lecteur via p.getErrorStream();

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    ProcessBuilder pb = new ProcessBuilder("./A",param1,parm2);
    		Process p = null;
    		try {
    			p = pb.start();
    			InputStream in = p.getErrorStream();
    			BufferedInputStream buf = new BufferedInputStream(in);
    			InputStreamReader inread = new InputStreamReader(buf);
    			BufferedReader bufferedreader = new BufferedReader(inread);
    			String line;
    			while ((line = bufferedreader.readLine()) != null) {
    				System.out.println(line);
    			}						
    		// dans un thread n°1, envoyer les données via p.getOutputStream().write(...)
    		// dans un thread n°2, lire la réponse via p.getInputStream().read(...)
    		// dans un thread n°3, lire les erreurs via p.getErrorStream().read(...)
    		// et dans le thread principal, on attends que tout soit finis :)
    			p.waitFor();
    		} catch (InterruptedException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}

  15. #15
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    a noter que tu peux fusionner inputstream et errorstream via processBuilder.redirectErrorStream(true)

  16. #16
    Membre confirmé Avatar de khallou2007
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    111
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mars 2008
    Messages : 111
    Par défaut
    Bonjour,

    Je reviens vers vous, je me suis rend compte que cette solution et partiel, en faite mon programme1 lance bien programme2 et après la fin d’exécution de ce dernier (programme2) avec l'instruction qui le contrôle p.waitFor();
    programme2 continu son travaille, MAIS ma question, je ne peux pas mettre programme2 en attente, c'est à dire après son lancement il ne se ferme pas il fait les calcules et rend la main au programme1 en attendant la prochain calcule , car si je le ferme ça l'initialise..
    Je ne sais pas si c'est claire?
    merci d'avance pour toute idée !!

  17. #17
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Si tu veux envoyer progressivement des données à travailler au programme2, il faudra que tu établisse un moyen de communiquer avec lui, pour lui fournir ces données. Souvent on utilise le stdin / stdout du programme en question.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Coupler la puissance de Java EE et PHP grâce à GlassFish
    Par Ricky81 dans le forum Glassfish et Payara
    Réponses: 14
    Dernier message: 07/02/2014, 14h06
  2. directx et java?? possible??
    Par jiraiya dans le forum DirectX
    Réponses: 3
    Dernier message: 09/07/2002, 19h55
  3. webcam : lire sur un port usb en c/c++ ou java. sous win. ?
    Par flo007 dans le forum Choisir un environnement de développement
    Réponses: 2
    Dernier message: 24/05/2002, 23h24
  4. Service de nommage java C++
    Par Anonymous dans le forum CORBA
    Réponses: 3
    Dernier message: 15/04/2002, 12h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo