2013-08-26 12 views
7

私の質問は主に標準に関するものですが、特定の実装がどのように問題に対処しているかについての情報も歓迎します。だから、それ以上のやり直しがなければ、私の質問は、JavaでOSインタフェースを実装するのは誰ですか?

  • Javaで動作するオペレーティングシステムは誰が担当しますか?
    • Java仮想マシン?
    • またはJavaクラスライブラリ?また、どのように、これは通常のJava Native Interfaceを経由、実装されている

例;私はjava.io.FileReaderを使ってファイルを読み込んでいます。このオブジェクトでreadを呼び出すとき、JVMは明らかにJCLの正しいクラスファイルでこの関数を呼び出しますが、最後のこのコードは呼び出しのためにJVMに依存します(例えば、posx read関数? - またはJNIを使​​用してクラスファイルがこれを行うのか?

答えて

1

実際にはJVM/JDKで作業していた人がこれに答えることを望んでいました。これまでのところ、誰もオンラインではないようです(またはあなたの質問を見てきました)、私はこれを説明することに行きます。

Javaクラスライブラリのクラス(JRE/JDKのrt.jarファイルにあります)は、実際には純粋なJavaです。彼らは、しかし、JNIの呼び出しがたくさん含まれています。あなたが例えばFileInputStreamのソースを見れば、あなたはこのようなものでしょう:

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

をだからあなたの推測は正しかった:JCLは、JNIの広範囲に使用するし。しかし、誰がそれらのネイティブな実装を提供していますか?シンプル:JVM。そして、それはどのように一緒にフィットする作品です。

+0

をだから、本当に、JVMは単に一般的なJNI機能を提供し、 Cコードを呼び出すことによって、システム依存のすべての操作を実装するためにJCLによって使用されますか? – Skeen

+0

これは、JVMを実装し、別のJVM(同じプラットフォーム)からJCLを単に借りることができるということですか? – Skeen

+0

最初の質問:そうです。 2番目の質問:理論的には、これはうまくいくはずです。少なくとも、なぜそれがうまくいかないのか分かりません。 –

0

コアの質問に答えるために、JVMはOSシェルの統合を担当します。 Javaクラスライブラリ(API)は、JVMを使用する一連の機能です。そのため、APIとも呼ばれています。

JNIの統合に関して、JVMはこれらの呼び出しを処理しています。クラスレベルでは、ネイティブ実装を持つコードを宣言する必要があります。

たとえば、System.arraycopy()メソッドを考えてみましょう。このメソッドにはネイティブ実装があります。 Systemクラスはメソッドのシグネチャを定義し、JVMは呼び出しをSystem.arraycopy()メソッドからネイティブのアンダーレイ実装に変換する役割を担います。あなたはhereからOpenJDKのソースをダウンロードした場合、あなたはホットスポット\ SRC \共有\ VM \おっと\ objArrayKlass.cppこの.cppファイルを確認することができます。

void objArrayKlass::copy_array(arrayOop s, int src_pos, arrayOop d, 
         int dst_pos, int length, TRAPS) { ... } 
関連する問題