2014-04-15 19 views
7

Basit bir c programıyla arabirim oluşturmak için JNI kullanan bir program yazıyorum. o c programı olduğu açıktır çünküJNI system.out ve printf davranışı

before 
10 
after 
Hello JNI 

bu çok garip Bana göre:

public static void main(String[] args) { 
    Hello h = new Hello(); 
    System.out.println("before"); 
    int number = h.sayHello(); 
    System.out.println(number); 
    System.out.println("after"); 
} 

ve benim sürpriz

JNIEXPORT int JNICALL Java_Hello_sayHello (JNIEnv *env, jobject obj) { 
    printf("Hello JNI\n"); 
    return 10; 
} 

bu program döner: Ben şu programları oluşturduk "before" ve "after" ifadeleri arasında çalıştırılır (10 rakamı yazdırılır). Ancak, printf ifadesi neden çağrıldığında yürütülmez? Jvm tarafından bir şekilde engelleniyor mu, çünkü aynı anda çıktıya sadece bir program yazılabilir mi? Bu davranışı düzeltmenin bir yolu var mı?

cevap

14

Evet. flush'u aramanız gerekecek.

System.out.println("before"); 
System.out.flush(); 
- bu sadece Çayı üzerinde flush olduğunu Java yılında

printf("Hello JNI\n"); 
fflush(stdout); 
return 10; 

- C yılında

, yani fflush çağrıdır