ネイティブメソッドスタック
前置き
java
javaで書かれ、バイトコードにコンパイルされ、以下のクラスファイルに格納されます。
Javaのメソッドはプラットフォームに依存しません。
ネイティブ・メソッド
ネイティブメソッドは他の言語で書かれ、プロセッサ関連のマシンコードにコンパイルされます。
ネイティブ・メソッドは、ダイナミック・リンク・ライブラリ、すなわち.dll(ウィンドウズ・システム)ファイルに、各プラットフォーム独自のフォーマットで格納されています。
ローカルメソッドはプラットフォームに依存しません
JNI
nativeキーワードで変更されたメソッドは、インターフェイスメソッドと同様にJNIです。
private native void minimizeImpl(long ptr, boolean minimize);
違いは、JNIも実装本体を見ることはできませんが、実際にはロード時間のjvmによって基礎となる実装を呼び出すには、JNIの実装本体は、Javaのコードで書かれていないが、他の言語で実装することができる、JNIは、Javaのコードと入り口のコードの他の言語の実装との間の接続として理解することができます。
JNIの実装はネイティブ・メソッド
Javaバイトコードを実行するとき、Nativeとマークされたメソッドに遭遇すると、JVMから他の言語で対応する関数が見つかり、一般的にネイティブ・メソッドに対応する関数がJVMに登録されます。
System.currentTimeMillis()
JNIクラスの最も有名なネイティブ・メソッドは.JNIです。 JNIは、Javaがオペレーティング・システムの機能や機能を深く利用し、Java以外のコードを再利用することを可能にします。 しかし、プロジェクトの過程で、他の多数の言語でJNIを実装すると、クロスプラットフォーム機能が失われます。
基本概念
ネイティブ・メソッド・スタックは仮想マシン・スタックと非常によく似た役割を果たしますが、仮想マシン・スタックが仮想マシンによって実行される Java メソッドを提供するのに対し、ネイティブ・メソッド・スタックは仮想マシンによって使用されるネイティブ・メソッドを提供する点が異なります。VM スタックと同様に、ネイティブ・メソッド・スタック領域も StackOverflowError と OutOfMemoryError 例外をスローします。
Nativeメソッドが実行されると、プログラム・カウンタの値はNULLになります。
Sun HotSpot VMは、ローカル・メソッド・スタックとVMスタックを直接1つに統合します。
スレッドがローカル・メソッドを呼び出し始めると、もはやJVMに制約されない世界に入ります。ネイティブ・メソッドは、JNIを介してVMランタイムのデータ領域にアクセスすることができ、JVMと同じ機能と権限でレジスタを呼び出すことさえできます。
HotSpotローカルメソッドスタック
どのネイティブ・メソッド・インターフェースも、ある種のネイティブ・メソッド・スタックを使用します。スレッドがJavaメソッドを呼び出すと、仮想マシンは新しいスタック・フレームを作成し、それをJavaスタックに押し込みます。しかし、ネイティブ・メソッドを呼び出すと、仮想マシンはJavaスタックをそのままにして、スレッドのJavaスタックに新しいフレームを押し付けません。
仮想マシンが「C」接続モデルを使用するローカル・メソッド・インターフェースを実装している場合、そのローカル・メソッド・スタックはCスタックです。C プログラムが C 関数を呼び出すとき、そのスタック操作は決定論的です。関数に渡された引数は、ある決定論的な順序でスタックに押され、その戻り値は決定論的な方法で呼び出し元に返されます。繰り返しますが、これは仮想マシンの実装におけるローカル・メソッド・スタックの動作です。
その場合、スレッドはローカル・メソッド・スタックの状態を保存し、別のJavaスタックに移動します。
次の図は、スレッドがローカル・メソッドを呼び出し、そのローカル・メソッドが仮想マシン内の別のJavaメソッドをコールバックするというシナリオを示しています。この図は、Java仮想マシン内でのスレッド操作の全体像を示しています。スレッドは、そのライフサイクルを通してJavaスタックを操作しながらJavaメソッドを実行することもあれば、Javaスタックとローカルメソッドスタックの間を滞りなくジャンプすることもあります!