1

最近、私は Java Native Interface について読んでいます。ところで、疑問があります。たとえば、Java プログラムで I/O 操作を行う必要がある場合、I/O 操作用の Java API を実行します。さらに、低レベルでは、OS レベルの I/O 処理にマップする必要があります。問題は、Java API がホスト オペレーティング システムのネイティブ I/O メソッドとどのように相互作用するかです。

一言で言えば、JDKのいくつかのメソッドがネイティブに実装されていると聞きました.それらのネイティブメソッドがJava APIによってどのように呼び出されるか.JNI(Java Native Interface)になると思います.

誰かが私の疑問を明確にしてくれませんか。

ありがとう

ヌワン・アランバージ

4

2 に答える 2

3

nativeJava のメソッドは、それらの実装が Java またはバイトコードではなく、プラットフォームに依存する何かで記述されていることを示すためにマークできます。たとえば、Java I/O 操作はほとんどの場合nativeメソッドとして実装されるため、マシンの基盤となるハードウェアまたは OS インターフェイスを利用できます。

nativeメソッドが実際にどのように実装されるかについての保証はありません。Sun (現在は Oracle) の JVM の実装では、JNI を使用してネイティブ メソッドの実装を記述し、カスタム ライブラリと対話して Java コードとやり取りする特別な名前の C 関数を定義できます。ただし、別の JVM では、まったく異なる方法でネイティブ メソッドを実装できます。実際、私は現在 JavaScript で JVM を実装するプロジェクトに取り組んでいるため、すべてのネイティブ メソッドは C ではなく JavaScript で実装されています。

nativeつまり、メソッドが実装される「一方向」はありません。肝心なのは、JVM と Java ライブラリの実装に最大限の柔軟性を与えることです。

于 2011-02-25T10:14:47.843 に答える
2

ネイティブ ライブラリがロードされると、メソッドはJVM にバインド(統合) されます。Java VM 仕様では、混乱を避けるために、リンクではなくバインディングという用語を使用しています。しかし、それは単なる言い回しです。

残りは簡単です。メソッドの呼び出しに使用されるバイトコード オペランドがいくつかあります。そして、そのメッセージがnativeと宣言されている場合、関連するネイティブ コードが呼び出されます。パラメータと結果は変換されるため、ネイティブ メソッドと非ネイティブ メソッドのどちらを呼び出しても違いはありません。

の仕様を見てください。箇条書きのリストがそのケースinvokevirtualをカバーしています。native

于 2011-02-25T10:30:24.743 に答える