2013-08-26 8 views
7

La mia domanda riguarda principalmente lo standard, ma anche l'input su come le implementazioni specifiche affrontano il problema. Quindi, senza ulteriori ripetizioni, la mia domanda è;Chi implementa l'interfaccia del sistema operativo in java?

  • Chi è responsabile dell'interfaccia del sistema operativo in Java?
    • La Java Virtual Machine?
    • o la libreria di classi Java?

anche come è questo di solito attuata, attraverso Java Native Interface?

Esempio; Sto leggendo un file, usando java.io.FileReader. Quando si invoca read su questo oggetto, la JVM chiamerà ovviamente questa funzione, nel file di classe corretto, nel JCL, tuttavia questo codice alla fine si baserà sulla JVM per la chiamata, ad esempio la funzione posix read? - o il file di classe lo farà da solo, attraverso l'uso di JNI? (supponendo che uno read debba essere fatto, cioè il file non sia già nella cache/memoria)

risposta

1

Speravo che un vero professionista rispondesse a questo, preferibilmente qualcuno che ha effettivamente lavorato su una JVM/JDK. Dal momento che finora nessuno di loro sembra essere online (o ha visto la sua domanda, per quella questione), darò una spiegazione a questo.

Le classi della libreria di classi Java (che si trovano nel file rt.jar di JRE/JDK) sono in realtà java puro. Contengono un sacco di chiamate JNI, però. Se si guarda alla fonte di FileInputStream per esempio, troverete cose come questa:

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

Quindi la tua ipotesi era corretta: il JCL non fanno largo uso di JNI. Ma chi fornisce queste implementazioni native? Semplice: la JVM. Ed è così che i pezzi si incastrano.

+0

Quindi, in realtà, la JVM fornisce solo la funzionalità generiche JNI, che viene utilizzato dal JCL per implementare tutte le operazioni dipendenti dal sistema, chiamando il codice C? – Skeen

+0

Significa anche che si potrebbe implementare una JVM e prendere in prestito semplicemente il JCL da un'altra JVM (per la stessa piattaforma)? – Skeen

+0

Prima domanda: sì, sì. Seconda domanda: in teoria, dovrebbe funzionare, sì. Almeno, non riesco a capire perché non dovrebbe funzionare. –

0

Per rispondere alla domanda principale, la JVM è responsabile dell'integrazione della shell del sistema operativo. La Java Class Library (API) è un insieme di funzionalità che utilizza la JVM, per questo viene anche chiamata API.

Per quanto riguarda l'integrazione JNI, la JVM sta gestendo queste chiamate. A livello di classe, devi dichiarare il codice che ha un'implementazione nativa.

Prendiamo ad esempio il metodo System.arraycopy(). Questo metodo ha un'implementazione nativa. La classe System definisce la firma del metodo e la JVM è responsabile della traduzione della chiamata dal metodo System.arraycopy() all'implementazione del underlay nativo. Se si scaricano i sorgenti OpenJDK da here, è possibile controllare questo file 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) { ... }