2013-10-09 2 views
2

J'ai DLL C++ qui exécute un programme Java en utilisant JNI, et j'essaie de comprendre comment capturer la sortie de ce programme Java. J'ai essayé d'utiliser un stringstream pour rediriger la stdout vers un buffer, mais cela ne semble que capturer la sortie provenant de ma DLL. Que puis-je faire pour lire dans System.out?Comment passer System.out de Java à C en utilisant JNI?

C'est ce que je suis en train maintenant, ce qui ne fonctionne pas:

using namespace std; 

stringstream buffer; 
streambuf * old = cout.rdbuf(buffer.rdbuf()); 
//run java stuff here 

Après que je fais cela, buffer.str() est encore vide, même si les méthodes Java exécutent correctement et il y a System.out. println() appelle dans ces méthodes. Si je fais quelque chose comme cout << "test" << endl;, le buffer.str() obtient ce texte, il ne semble pas être un problème avec le tampon. Quelles sont mes options ici?

Répondre

1

En modifiant tampon cout, vous n'avez pas modifié le flux de sortie standard, tout l'objet utilisé pour encapsuler.

Pour rediriger complètement la sortie, vous devez freopenstdout à un fichier ou un tuyau, vous pouvez obtenir plus d'informations dans ce question.

ensuite pour obtenir la sortie complète du code Java, vous pouvez ouvrir le même fichier (ou pipe) en mode de lecture d'un obtenir simplement les informations que vous voulez. En passant, dans votre exemple de code, vous n'avez pas besoin du stringstream mais juste du stringbuf non associé?

+0

Je vais avoir le même problème avec cela - que les choses que j'imprimer à l'aide printf() est redirigé vers le fichier. –

+0

Ensuite, la machine virtuelle Java rouvre le stdin ... Question intéressante, je vais essayer de penser à demain encore. Je pense que vous devez le pirater d'abord du côté Java – Geoffroy

Questions connexes