échange des données entre une application java et une C++

Fermé
manel1989 Messages postés 10 Date d'inscription dimanche 15 septembre 2013 Statut Membre Dernière intervention 3 novembre 2014 - 15 sept. 2013 à 19:31
 manel1989 - 20 sept. 2013 à 18:56
Bonjour,

Je veux obtenir la sortie d"une application C + + à partir d'une applications Java. J'ai utilisé un fichier abs.bat pour le faire

J'ai utilisé ce code dans bat.:
start readxmlresou.exe

cette ligne de commande ouvre readxmlresou.exe qui est l'exécutable essue de l'application codé dans VS2010C++,cet exécutable se trouve dans mon bureau, cette commande l'exécute aussi, maintenant je veux obtenir le résultat de l'exécutable dans lapplication appelante java, j'ai écrit ce code mais il ne fonctionne pas:
 public Process DoSysCommand(boolean bWait) throws IOException
{
Runtime runtime1 = Runtime.getRuntime();
final Process process = runtime1.getRuntime().exec(new String[]{"C:\\Users\\abdelhalim\\Desktop\\abs.bat", "readxmlresou.exe"}, null, new File("C:\\Users\\abdelhalim\\Desktop\\"));
process.getInputStream();
OutputStream out = null;
InputStream in= null;
// Consommation de la sortie standard de l'application externe dans un Thread separe
new Thread() {
public void run() {
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line = "";
try {
while((line = reader.readLine()) != null) {
// Traitement du flux de sortie de l'application si besoin est
System.out.println("line="+ line);
}
} finally {
reader.close();
}
} catch(IOException ioe) {
ioe.printStackTrace();
}
}
}.start();
// Consommation de la sortie d'erreur de l'application externe dans un Thread separe
new Thread() {
public void run() {
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getErrorStream()));
String line = "";
try {
while((line = reader.readLine()) != null) {
// Traitement du flux d'erreur de l'application si besoin est
}
} finally {
reader.close();
}
} catch(IOException ioe) {
ioe.printStackTrace();
}
}
}.start();
try
{
process.getInputStream();
if(bWait)
{
process.waitFor();
}
}
catch(InterruptedException e)
{
System.err.println(e.getMessage());
}
return process;
}
}

ce que je reçois quand je click le bouton dans l'interface graphique en Java est le resultat de l'exécution readxmlresou.exe (la console VS2010 c + + montre la sortie de l'application C + + readxmlresou.exe ) et puis il se bloque là, les 2 applications se bloquent à ce stade, même l'application C ++ ne se ferme pas????

Je vais essayer de le comprendre, donc si vous avez une idée à ce sujet, je suis vraiment très reconnaissante pour votre aide
A voir également:

1 réponse

KX Messages postés 16755 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 12 février 2025 3 020
Modifié par KX le 15/09/2013 à 20:27
Il n'est pas nécessaire de passer par un fichier .bat pour cela, tu peux directement appeler ton .exe avec la commande exec.

De plus je ne pense pas qu'il soit nécessaire de retourner le Process, à part peut-être pour arrêter son fonctionnement, mais dans ce cas il faut aussi penser à fermer les Thread, donc il faut aussi retourner les deux threads...

Voici un code remanié :

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintStream;
import java.util.Scanner;

class Program
{
private final Process proc;
private final Thread out, err;

public Program(String[] cmd, String[] envp, File dir, PrintStream pOut, String formatOut, PrintStream pErr, String formatErr) throws IOException
{
proc = Runtime.getRuntime().exec(cmd, envp, dir);

out = new Transfert(proc.getInputStream(), pOut, formatOut);
err = new Transfert(proc.getErrorStream(), pErr, formatErr);

out.start();
err.start();
}

public void kill()
{
out.interrupt();
err.interrupt();

proc.destroy();
}
}

class Transfert extends Thread
{
private final InputStream in;
private final PrintStream out;
private final String format;

public Transfert(InputStream in, PrintStream out, String format)
{
this.in = in;
this.out = out;
this.format = format;
}

@Override
public void run()
{
Scanner sc = new Scanner(in);

while (sc.hasNextLine())
{
if (isInterrupted())
break;

out.printf(format, sc.nextLine());
}

sc.close();
}
}

public class Test
{
public static void main(String[] args) throws Exception
{
Program prg = new Program(new String[] {"readxmlresou.exe"}, null, new File("C:/Users/abdelhalim/Desktop/"), System.out, "lineOut=%s\n", System.err, "lineErr=%s\n");
}
}
0
manel1989 Messages postés 10 Date d'inscription dimanche 15 septembre 2013 Statut Membre Dernière intervention 3 novembre 2014
15 sept. 2013 à 22:22
Salut !

j'ai vraiment essayé avec ce code mais le probème persiste , pas d'affichage de données se trouvant sur le console de c++ sur le console java :((((((((((((, mais pour que je puisse ouvrir readxmlresou.exe il me fallait utiliser un fichier .bat parce sinon avec seulment le code que vous m'avez donné le console ne s'ouvre pas ......

j'ai meme essayé une autre apllication telque le notepad , mais le mem résultat pas d'affichage

avez vous une idée sur ça ?????

Merci énormément
0
KX Messages postés 16755 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 12 février 2025 3 020
16 sept. 2013 à 00:13
Il n'est pas nécessaire que la console s'ouvre avec ton .bat puisqu'elle s'ouvre déjà pour Java, tu n'as pas besoin de deux consoles. Mais si tu as des entrées clavier à entrer, il faut aussi les transférer vers l'objet Process avec la méthode getOutputStream, ce qui te permet de faire au besoin des entrées clavier côté Java et de les rediriger vers le programme C++ sans avoir à manipuler directement ce programme, ni avec un bat ni avec autre chose que Java.

J'ai adapté le code de tout à l'heure pour intégrer le clavier, j'en ai profité pour enlever deux ou trois trucs pas vraiment utiles, tu les remettras si tu en as vraiment besoin.

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Scanner;

class Program
{
private final Process proc;
private final Thread out, err, in;

public Program(String cmd, OutputStream pOut, OutputStream pErr, InputStream pIn) throws IOException
{
proc = Runtime.getRuntime().exec(cmd);

out = new Transfert(proc.getInputStream(), pOut);
err = new Transfert(proc.getErrorStream(), pErr);
in = new Transfert(pIn, proc.getOutputStream());

out.start();
err.start();
in.start();
}

public void kill()
{
out.interrupt();
err.interrupt();
in.interrupt();

proc.destroy();
}
}

class Transfert extends Thread
{
private final InputStream in;
private final OutputStream out;

public Transfert(InputStream in, OutputStream out)
{
this.in = in;
this.out = out;
}

@Override
public void run()
{
Scanner sc = new Scanner(in);
try
{
while (sc.hasNextLine())
{
out.write((sc.nextLine() + System.lineSeparator()).getBytes());
out.flush();

if (isInterrupted())
break;
}
}
catch (IOException e)
{
System.err.println(e);
}

sc.close();
}
}

public class Test
{
public static void main(String[] args) throws Exception
{
Program prog = new Program("C:/Division.exe", System.out, System.err, System.in);
}
}

Voici le code C++ avec lequel j'ai testé.

#include <iostream>

int main()
{
int a,b;

std::cout << "a = ";
std::cin >> a;

std::cout << "b = ";
std::cin >> b;

if (b==0)
std::cerr << "Division par zero interdite" << std::endl;
else
std::cout << "a/b = " << (a/b) << std::endl;

return 0;
}

Remarque : il y a un petit bug, le thread clavier attend une entrée supplémentaire à la fin du programme et plante quand il l'a enfin reçu...
0
manel1989 Messages postés 10 Date d'inscription dimanche 15 septembre 2013 Statut Membre Dernière intervention 3 novembre 2014
16 sept. 2013 à 02:07
salut
mon programme ne reçoi rien du programme javva , just le programme java fait un apple au programme c++ et reçoi le résultat de l'exécution,, apparament je fais un erreur , voici les étapes que j'ai fais pour tourner votre code :
1_ créer un nouveau projet dans java dont le nom est : Program
2_ ////////////////////////////////////////////////////////////////////////////////////////////: Test
3_ j'ai copier coller votre code dans ces 2 classes
4 - créer u nouveau projet dans vs2010c++ appelé abs et j'ai fait copie coller de votre code
5_ j'exécute le code dans java

le résultat obteu : pas d'erreur et pas d'affichage aussi , apparament il me manque quelque chose ici ????

Qu'est ce que vous croyez ????????
0
KX Messages postés 16755 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 12 février 2025 3 020
Modifié par KX le 16/09/2013 à 07:48
Il ne faut pas créer de nouveaux projets à chaque fois, sinon ils sont indépendants.

1) Tu créé un nouveau projet C++ appelé Division par exemple, tu copies-colles le code, tu compiles, et tu mets le fichier .exe par exemple sur C:\Division.exe
2) Tu crées un nouveau fichier Test.java et tu fais un copier-coller en une seule fois de tout mon code dans ce fichier (les import, la classe Program, la classe Transfert, la classe Test)
3) Si ton programme C++ ne s'appelle pas Division ou s'il n'est pas dans C:\ tu modifies le code de la méthode main en remplaçant "C:/Division.exe" par la bonne valeur.
4) Tu compiles et tu exécutes la classe Test

Remarque : tu peux passer la partie 1 et directement mettre le chemin d'accès à ton programme "readxmlresou.exe" lors de la modification du main dans la partie 3...
0
Salut !
Malgré , j'ai fais exactement tous ce que vous avez dis mais aucun resultat !!! normalement, lorsque j'exécute la console de c++ s'ouvre mais rien ne s'affiche ??????? j'ai essayé de faire tous ce que vous m'avez dis pas à pas mais je ne sais pas où est l'erreur .

j'ai cherché sur google et j'ai trouvé le JNI.Pourais je avec le JNI faire l'accée à mon code C++ ??
honnetement je sais pas comment faire ???

Qu'est ce que vous croyez????

Merci beaucoup
0