2010-04-06 5 views
2

que je dois exécuter cette ligne de mon C++ programme:Comment appeler Java C++

java jar test.jar text1 text2

l'application java donnera une valeur flottante et donner au C++ programme.

Comment est-ce que je peux faire ceci? Je n'appelle jamais un truc java avant de mon fichier Visual C++.

+0

Pourquoi tu ne les acceptez pas des réponses sur vos questions? – Shaihi

+0

Je ne sais pas si j'ai besoin d'accepter les réponses. à propos, comment accepter? – karikari

+0

on dirait qu'il a "accepté" sa propre "réponse", ce qui est une autre question>. < – Kayvar

Répondre

0

Lorsque Je cours la commande de java directement sur mon invite de commande, cela fonctionne. mais lorsque j'exécute la commande à partir du fichier C++, l'erreur indique "Le système ne peut pas exécuter le programme spécifié".

voici mon code, en utilisant im ms Visual Studio 2005:

#include "stdafx.h" 

#include <conio.h> 


int _tmain(int argc, _TCHAR* argv[]) 
{ 

    float value; 

    FILE *child = _popen("java -jar c:\simmetrics_jar_v1_6_2_d07_02_07.jar text1 ssdyr445", "r"); 
    if (fscanf(child, "%f", &value) == 1) 
     { 
      fprintf(stdout,"Got Value from simmetrics: %f\n", value); 
    } 
    else 
     { 
      fprintf(stdout,"ERROR\n"); 
     } 
    fclose(child); 

    return 0; 
} 
4

Si vous voulez un couplage fort, utilisez JNI wrapper.

-1

Le plus facile si vous pouvez modifier votre code java:

écrire le résultat à la variable d'environnement (pseudo code ci-dessous): (.. Écrire directement à env dans l'application java)

solution

1.

java:

... 
setenv('ret', somefloatvalue); 
... 

exit.. 

C++:

system("java -jar test.jar text1 text2") 
... 
getenv("ret") 

(je ne l'ai pas tester, mais important est le contexte ici, est-système crée un autre shell (console), si oui, vous ne verrez pas ces envs donc une autre méthode de spawn est nécessaire)

CreateProcess() sur Windows fork() sur linux.

Il existe également des solutions plus complexes,

  • envoyer des JASON à travers les prises de .... etc.
  • écrire dans le fichier texte en java, lu dans C++.
  • MPI ...
  • extrême dans ce cas CORBA;)
+0

Je ne pense vraiment pas à comment ça fonctionne. – Blindy

+0

N'a pas testé, vous avez raison, corrigé, merci. – bua

+0

Cela ne fonctionnera pas. Quand le système tourne vers le haut, il crée son propre environnement pour que l'application s'exécute (une copie de l'envronment des parents C++). Lorsque l'application Java modifie l'environnement, elle modifie son propre environnement (pas ses parents). Ainsi, le parent ne verra jamais les chnages. –

0

Une solution simple consiste à utiliser popen() et pclose().

Les fonctions popen(), forks() et execs() a sous-processus. Mais il associe les sous-processus standard-in et standard-out à l'objet stream créé par popen. writting Par conséquent, tout au courant dans le parent, il envoie à la norme dans des sous-processus alors que tout ce que les sous-processus écrit à la norme-out peuvent être lus à partir du flux par le parent:

double value; 
FILE* child = popen("java -jar test.jar text1 text2", "r"); 
if (fscanf(child, "%f", &value) == 1) 
{ 
    fprintf(stdout,"Got Value: %f\n", value); 
} 
else 
{ 
    fprintf(stdout,"ERROR\n"); 
} 
fclose(child); 
+0

J'ai essayé le code, mais ne fonctionne toujours pas. Il ne réussit pas à transmettre la valeur float de l'application jar. #include #include using namespace std; Principal() { valeur flottante; FICHIER * child = popen ("java -jar simmetrics_jar_v1_6_2_d07_02_07.jar text1 aab676788", "r"); fscanf (enfant, "% f", & valeur); Ffprintf (stdout, "Valeur obtenue de simmetrics:% f \ n", valeur); fclose (enfant); return 0; } – karikari

+0

Avez-vous vérifié le résultat de popen? Si elle ne parvient pas à démarrer la machine virtuelle Java ou ne parvient pas à trouver le fichier jar, cela générera une erreur. –

Questions connexes