2014-04-15 6 views
7

मैं एक प्रोग्राम लिख रहा हूं जो एक साधारण सी प्रोग्राम के साथ इंटरफेस करने के लिए जेएनआई का उपयोग करता है।जेएनआई system.out और 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; 
} 
मेरे आश्चर्य करने के लिए

इस कार्यक्रम रिटर्न:: मैं निम्नलिखित प्रोग्राम बनाया है

before 
10 
after 
Hello JNI 

मेरे लिए यह बहुत ही अजीब है, क्योंकि यह ग प्रोग्राम है जो स्पष्ट है "पहले" और "बाद" कथन के बीच निष्पादित किया गया है (संख्या 10 मुद्रित है)। लेकिन जब इसे कहा जाता है तो printf कथन निष्पादित क्यों नहीं किया जाता है। क्या यह किसी भी तरह से जेवीएम द्वारा अवरुद्ध है क्योंकि एक ही समय में आउटपुट को लिखने की अनुमति है? क्या इस व्यवहार को सही करने का कोई तरीका है?

उत्तर

14

हां। आपको flush पर कॉल करने की आवश्यकता होगी।

C में, कि fflush कॉल है -

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

Java में, कि बस flush स्ट्रीम पर है -

System.out.println("before"); 
System.out.flush();