2010-10-24 3 views
24

Ho un plugin Eclipse (A) che ha una dipendenza da un altro plugin (B). Il plugin B è semplicemente un wrapper attorno a un jar, che contiene una dll nativa, ed esegue la funzionalità jni. Dato questa configurazione, ho il seguente codice nel metodo start di di una classe Activator:Come posso reindirizzare l'output della console JNI alla vista di Eclipse Console, quando il plugin Eclipse utilizza 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)); 

Quando plug A svolge la sua funzionalità, qualsiasi utilizzo di System.out va in realtà alla console all'interno di Eclipse. Ma il codice nativo usato da JNI scrive anche sullo stream di output, che non posso afferrare. Durante lo sviluppo, l'output da JNI passa alla console dell'istanza Eclipse che ha avviato l'istanza in esecuzione, che contiene i plugin.

Quindi, come posso prendere l'uscita JNI e visualizzarla nella console?

+2

Quali funzioni registrano i messaggi nel codice nativo? printf, fprintf, puts? ... Sareste liberi di riscrivere il codice, cambiando la funzione di logging? –

+0

Dal momento che JNI è coinvolto: quanto portatile deve essere una soluzione? Su quali piattaforme dovrebbe funzionare almeno? –

risposta

0

Non puoi, davvero. La DLL nativa utilizza i metodi stdio a cui non è possibile accedere da Java. Se si scrive su System.out, il runtime Java alla fine utilizza gli stessi metodi, ma per ovvi motivi, il System.out non ha alcun effetto sul sottostante del runtime C.

C'è una soluzione hardware: Ottieni un secondo monitor in modo da poter vedere il terminale in cui hai avviato Eclipse tutto il tempo.

1

Si potrebbe provare a utilizzare freopen per reindirizzare lo stdout esattamente nello stesso modo in Java, ma sul lato nativo. La domanda è se questo potrebbe funzionare se lo si è usato nel proprio plugin (con una nuova dll JNI): potrebbe essere necessario utilizzarlo dalla dll facendo l'output della console, non ho idea dell'interazione tra i flussi attraverso DLL . Se stdout fa riferimento a un flusso condiviso per l'intero processo, forse funzionerebbe.