2014-04-15 17 views
7

Tôi đang viết một chương trình sử dụng JNI để giao tiếp với một chương trình c đơn giản. Tôi đã tạo ra các chương trình sau:Hệ thống JNI.out và hành vi printf

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"); 
} 

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

Trước sự ngạc nhiên của tôi chương trình này lợi nhuận:

before 
10 
after 
Hello JNI 

Đối với tôi đây là rất lạ bởi vì nó là rõ ràng rằng chương trình c được thực hiện giữa câu lệnh "before" và "after" (Số 10 được in). Nhưng tại sao lệnh printf không được thực thi khi nó được gọi. Có bằng cách nào đó bị chặn bởi jvm bởi vì chỉ có một chương trình được phép ghi vào đầu ra cùng một lúc? Có cách nào để khắc phục hành vi này không?

Trả lời

14

Có. Bạn sẽ cần gọi số flush.

Trong C, đó là fflush cuộc gọi -

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

Trong Java, đó chỉ là flush trên Stream -

System.out.println("before"); 
System.out.flush(); 
Các vấn đề liên quan