2012-10-04 17 views
6

Tengo una aplicación Java que llama a una DLL escrita en C++ a través de JNI, esta DLL carga dinámicamente otra DLL. De alguna manera, los mensajes escritos para cerr en C++ aparecen en algunos casos en algunas computadoras en el Stdout-Stream de la parte de Java. No hay una redirección explícita de ninguno de los flujos estándar (cerr, cout, Stdout, Sterr, etc.) ni en la parte de C++ ni en la parte de Java.¿Cómo puede aparecer cerr (C++) en Stdout (Java)?

¿Cómo puede suceder esto? ¿Cómo puedo asegurarme de que la cerr-stream de la capa de C++ termine en la corriente de Stderr de la capa de Java?

La JVM es en todos los casos el mismo,

JRE versión: 6.0_27-b07, Java VM: Java HotSpot (TM) Client VM (20.2-B06 modo de Windows en 86 mixtos)

+2

Lo más probable es que esto se deba a que la JVM se está implementando en 'C++' –

+2

@SriHarshaChilakapati ¿por qué debería importar? – user93353

+0

Como la JVM se implementa en 'C++', la capa de Java estará en la parte superior de la capa de C++. Entonces, creo que esto está sucediendo, ya que Java Layer lee la consola en la que se imprimen los mensajes de C++. Esto también puede ocurrir porque los errores publicados por 'jni dll' están siendo monitoreados por la JVM. –

Respuesta

2

Para Responde tu pregunta directamente, std :: cerr solo puede aparecer en System.out si comparten el mismo descriptor.

Si realmente ocurre en algunas computadoras y no en otras, sospecho que hay diferencias en las implementaciones de Java de System.out y System.err predeterminadas. No indicó instalaciones idénticas de Java, solo computadoras diferentes. Java no garantiza sus implementaciones de flujo de salida predeterminadas.

Ahora, debido a que los descriptores de amortiguación y de archivo en cada lado no están coordinadas entre sí, existen sólo dos posibilidades:

1) Usted tiene acceso a la fuente de DLL y puede cambiar todo de E/S de utilizar su pasado en System.out/err secuencias de Java.

2) No es así. En ese momento, incluso si aparentemente tiene éxito mediante el lavado cooperativo, no puede probar la corrección más allá de la evidencia experimental de que su hack parece funcionar. Existe una buena posibilidad de que la experimentación no descubra casos de esquina donde los búferes están exactamente llenos, vacíos o cuando comparten el mismo descriptor de archivo.

Esperemos que pueda elegir el n. ° 1.

Cuestiones relacionadas