2012-04-28 16 views
6

He estado experimentando con JNI recientemente, para portar algunas bibliotecas C++ existentes.Llamadas JNI intercaladas con llamadas regulares de Java: ¿cuál es el orden de ejecución?

Como parte de mis pruebas creé un programa simple 'helloworld'. Estoy llamando a una función nativa simple en C++, que solo imprime mensajes. Estoy un poco curioso acerca de algún comportamiento que he observado al ejecutar el programa, parece que todos los mensajes/respuestas de la función nativa se imprimen después de Java System.out.print. ¿Esto se debe a que las llamadas nativas se ejecutan después de las llamadas Java, o debo simplemente ignorar este comportamiento?

public static void main(String[] args) { 
     HelloWorld app = new HelloWorld(); 
     System.out.println("say"); 
     app.print(); 

     System.out.println("what"); 
     app.print(); 
} 

La salida tiene el siguiente aspecto:

say 
what 
hola, world ! 
hola, world ! 

La función nativa es el siguiente:

Java_HelloWorld_print(JNIEnv *env, jobject obj) { 
    printf("hola, world !\n"); 
    return; 
} 
+1

¿Funcionar después de imprimir en código nativo hace la diferencia? –

+0

te refieres a fflush (stdout); ?? porque yo probé y di la misma salida. Gracias –

+0

oh lo siento, he actualizado el método nativo equivocado. Sí, usar fflush (stdout) hace la diferencia. Gracias. –

Respuesta

3

¿Esto es porque se ejecutan las llamadas nativas después de Java llama

No, casi seguro tiene que ver con la forma en que el resultado se almacena en los lados C++ y Java.

El orden de ejecución de las llamadas es exactamente como aparece en el código (Java, C++, Java, C++).

Cuestiones relacionadas