2010-10-24 9 views
24

Tengo un plugin de Eclipse (A) que tiene una dependencia en otro complemento (B). El complemento B es simplemente un contenedor alrededor de un contenedor, que contiene un dll nativo y ejecuta la funcionalidad jni. Dada esta configuración, tengo el siguiente código en el método de inicio de clase Activador de A:¿Cómo puedo redirigir la salida de la consola JNI a la vista de la consola Eclipse, cuando el complemento Eclipse usa 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)); 

Cuando Plugin A realiza su funcionalidad, cualquier uso de System.out que realmente sucede dentro de la consola de Eclipse. Pero el código nativo utilizado por JNI también escribe en el flujo de salida, que no puedo captar. Durante el desarrollo, la salida de JNI va a la consola de la instancia de Eclipse que ha lanzado la instancia en ejecución, que contiene los complementos.

Entonces, ¿cómo capturo la salida JNI y la visualizo en la consola?

+2

¿Qué función (es) registra mensajes en el código nativo? printf, fprintf, puts? ... ¿Sería libre de reescribir el código, cambiando la función de registro? –

+0

Dado que JNI está involucrado: ¿Qué tan portátil debe ser una solución? ¿En qué plataformas debería funcionar al menos? –

Respuesta

0

No puedes, realmente. La DLL nativa usa métodos stdio a los que no se puede acceder desde Java. Si escribe en System.out, el tiempo de ejecución de Java finalmente usa los mismos métodos, pero por razones obvias, los cambios de System.out no tienen ningún efecto subyacente en el tiempo de ejecución de C.

Hay una solución de hardware: obtenga un segundo monitor para que pueda ver el terminal en el que inició Eclipse todo el tiempo.

1

Puede intentar usar freopen para redirigir stdout exactamente de la misma forma que lo hace en Java, pero en el lado nativo. La pregunta es si esto funcionaría si lo usara en su propio complemento (con un nuevo dll JNI): puede necesitar ser utilizado desde el dll haciendo la salida de la consola, no tengo idea de la interacción entre las secuencias de archivos DLL . Si stdout se refiere a una transmisión compartida para todo el proceso, quizás funcione.

Cuestiones relacionadas