2013-08-26 59 views
7

Câu hỏi của tôi chủ yếu liên quan đến tiêu chuẩn, nhưng đầu vào về cách triển khai cụ thể giải quyết vấn đề cũng được chào đón. Vì vậy mà không làm lại thêm, câu hỏi của tôi là;Ai thực hiện hệ điều hành giao tiếp trong java?

  • Ai chịu trách nhiệm về hệ điều hành giao tiếp trong Java?
    • Máy ảo Java?
    • hoặc Thư viện lớp Java?

Ngoài ra, cách này thường được triển khai thông qua Giao diện bản địa Java?

Ví dụ; Tôi đang đọc một tập tin, bằng cách sử dụng java.io.FileReader. Khi gọi read trên đối tượng này, JVM rõ ràng sẽ gọi hàm này, trong tệp lớp đúng, trong JCL, tuy nhiên mã này cuối cùng dựa vào JVM để gọi, ví dụ hàm posix read? - hoặc tập tin lớp sẽ tự làm điều này, thông qua việc sử dụng JNI? (giả sử read phải được thực hiện, đó là tệp chưa có trong bộ nhớ cache/bộ nhớ)

Trả lời

1

Tôi đã hy vọng một số chuyên gia thực sự sẽ trả lời câu hỏi này, tốt nhất là người đã thực sự làm việc trên JVM/JDK. Cho đến nay, không ai trong số họ có vẻ là trực tuyến (hoặc đã nhìn thấy câu hỏi của bạn, cho rằng vấn đề), tôi sẽ có một đi giải thích điều này.

Các lớp Thư viện lớp Java (được tìm thấy trong tệp rt.jar của tệp JRE/JDK) của bạn thực chất là thuần java. Tuy nhiên, chúng có chứa rất nhiều cuộc gọi JNI. Nếu bạn nhìn vào nguồn gốc của FileInputStream ví dụ, bạn sẽ tìm thấy những thứ như thế này:

private native int readBytes(byte b[], int off, int len) 
    throws IOException; 

public int read(byte b[]) 
    throws IOException 
{ 
    return readBytes(b, 0, b.length); 
} 

Vì vậy đoán của bạn là chính xác: các JCL không làm cho sử dụng rộng rãi của JNI. Nhưng ai cung cấp những triển khai bản địa này? Đơn giản: JVM. Và đó là cách các mảnh ghép lại với nhau.

+0

Vì vậy, thực sự, JVM chỉ cung cấp chức năng JNI chung chung, được sử dụng bởi JCL để thực hiện tất cả các hoạt động phụ thuộc hệ thống, bằng cách gọi mã C? – Skeen

+0

Cũng có nghĩa là, người ta có thể thực hiện một JVM và chỉ cần mượn JCL từ một JVM khác (cho cùng một nền tảng)? – Skeen

+0

Câu hỏi đầu tiên: Có thực sự. Câu hỏi thứ hai: Về lý thuyết, điều này nên làm việc, vâng. Ít nhất, tôi không thể thấy tại sao nó không hoạt động. –

0

Để trả lời câu hỏi cốt lõi của bạn, JVM chịu trách nhiệm tích hợp vỏ hệ điều hành. Thư viện lớp Java (API) là một tập hợp các chức năng sử dụng JVM, đó là lý do tại sao nó cũng được gọi là một API.

Về tích hợp JNI, JVM đang xử lý các cuộc gọi này. Ở cấp độ lớp học của bạn, bạn phải khai báo mã có triển khai gốc.

Ví dụ: phương thức System.arraycopy(). Phương pháp này có triển khai gốc. Lớp Hệ thống định nghĩa chữ ký của phương thức và JVM chịu trách nhiệm dịch cuộc gọi từ phương thức System.arraycopy() sang thực thi lớp lót gốc. Nếu bạn tải về các nguồn OpenJDK từ here, bạn có thể kiểm tra này tập tin cpp hotspot \ src \ share \ vm \ oops \ objArrayKlass.cpp:

void objArrayKlass::copy_array(arrayOop s, int src_pos, arrayOop d, 
         int dst_pos, int length, TRAPS) { ... }