2012-04-28 38 views
6

Gần đây tôi đã thử nghiệm với JNI, để chuyển một số thư viện C++ hiện có.Các cuộc gọi JNI xen kẽ với các cuộc gọi Java thông thường - lệnh thực thi là gì?

Là một phần của thử nghiệm của tôi, tôi đã tạo một chương trình 'helloworld' đơn giản. Tôi đang gọi một hàm gốc đơn giản trong C++, mà chỉ cần in các thông báo. Tôi là một chút tò mò về một số hành vi tôi đã quan sát thấy trong khi thực hiện chương trình - có vẻ như tất cả các tin nhắn chức năng bản địa/phản ứng được in sau khi Java System.out.print của. Đây có phải là vì các cuộc gọi bản địa được thực thi sau khi các cuộc gọi Java, hay tôi sẽ bỏ qua hành vi này?

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

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

Kết quả trông như thế này:

say 
what 
hola, world ! 
hola, world ! 

Chức năng bản địa như sau:

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

Có fflush sau khi in trong mã gốc tạo sự khác biệt? –

+0

bạn có nghĩa là fflush (stdout); ?? cuz tôi đã thử điều đó và đưa ra cùng một đầu ra. Cảm ơn –

+0

oh xin lỗi, tôi đã cập nhật phương pháp gốc sai. Yeah sử dụng fflush (stdout) tạo nên sự khác biệt. Cảm ơn. –

Trả lời

3

Đây có phải là vì các cuộc gọi có nguồn gốc được thực hiện sau khi Java gọi

Không, nó gần như chắc chắn đã làm với cách đầu ra được đệm trên các bên C++ và Java.

Thứ tự thực hiện của các cuộc gọi chính xác như khi nó xuất hiện trong mã của bạn (Java, C++, Java, C++).

Các vấn đề liên quan