2010-10-24 16 views
24

J'ai un plugin Eclipse (A) qui dépend d'un autre plugin (B). Le plugin B est simplement un wrapper autour d'un jar, qui contient une DLL native, et effectue des fonctionnalités jni. Compte tenu de cette configuration, je le code suivant dans la méthode de démarrage de la classe Activator de A:Comment puis-je rediriger la sortie de la console JNI vers la vue Console Eclipse, lorsque le plugin Eclipse utilise JNI?

MessageConsole jniConsole = new MessageConsole("Opereffa Output", null); 
ConsolePlugin.getDefault().getConsoleManager().addConsoles(new IConsole[] { jniConsole }); 
ConsolePlugin.getDefault().getConsoleManager().showConsoleView(jniConsole); 
MessageConsoleStream stream = jniConsole.newMessageStream(); 
System.setOut(new PrintStream(stream)); 
System.setErr(new PrintStream(stream)); 

lorsque le plugin A effectue ses fonctionnalités, toute utilisation de System.out va en fait à la console au sein d'Eclipse. Mais le code natif utilisé par JNI écrit également dans le flux de sortie, que je ne peux pas saisir. Pendant le développement, la sortie de JNI est envoyée à la console de l'instance Eclipse qui a lancé l'instance en cours d'exécution, qui contient les plugins.

Alors, comment puis-je saisir la sortie JNI et afficher dans la console?

+2

Quelle (s) fonction (s) consignent les messages dans le code natif? printf, fprintf, puts? ... Seriez-vous libre de réécrire le code, en changeant la fonction de journalisation? –

+0

Depuis JNI est impliqué: Comment portable doit être une solution? Sur quelles plateformes devrait-il fonctionner au moins? –

Répondre

0

Vous ne pouvez pas, vraiment. La DLL native utilise des méthodes stdio auxquelles vous ne pouvez pas accéder depuis Java. Si vous écrivez dans System.out, le runtime Java utilise finalement les mêmes méthodes, mais pour des raisons évidentes, les modifications de System.out n'ont aucun effet sur le sous-jacent du runtime C.

Il existe une solution matérielle: Obtenez un deuxième moniteur pour pouvoir voir le terminal dans lequel vous avez démarré Eclipse tout le temps.

1

Vous pouvez essayer d'utiliser freopen pour rediriger stdout exactement comme vous le faites en Java, mais sur le côté natif. La question est de savoir si cela fonctionnerait si vous l'utilisiez dans votre propre plugin (avec une nouvelle DLL JNI): il peut être nécessaire d'utiliser la DLL depuis la sortie de console, je n'ai aucune idée de l'interaction entre les flux sur les DLL . Si stdout fait référence à un flux partagé pour l'ensemble du processus, peut-être que cela fonctionnerait.