記事ディレクトリ
1つのローカルメソッドインターフェイス
データ領域のネイティブメソッドがスタックする前にJava仮想マシンが実行されていると言えば、データ領域の外側でJNI(Java Native Interface)のネイティブメソッドインターフェイスの略語と呼ばれるものが実行されているとします。
ローカルメソッドとは何ですか?
-
簡単に言えば、ネイティブメソッドは非JavaコードインターフェイスへのJava呼び出しです
-
ネイティブメソッドはJavaメソッドです。メソッドはCなどの非Java言語で実装されます。
-
この機能はJavaに固有のものではありません。他の多くのプログラミング言語にもこのメカニズムがあります。たとえば、C ++では、externを使用してC ++コンパイラにC関数を呼び出すように指示できます。
-
「ネイティブメソッドは、実装が非Javaコードによって提供されるJavaメソッドです。」(ネイティブメソッドは非Javaメソッドであり、その特定の実装は非Javaコードの実装です。)
-
ネイティブメソッドを定義する場合、実装本体はJava以外の言語によって外部で実装されるため、実装本体は提供されません(Javaインターフェイスの定義に似ています)。
-
ネイティブインターフェイスの役割は、Javaのさまざまなプログラミング言語を統合することであり、本来の目的はC / C ++プログラムを統合することです。
ネイティブメソッドの例
ObjectクラスのgetClass()メソッド
public final native Class<?> getClass();
Threadクラスのstart()メソッド
public synchronized void start() {
/**
* This method is not invoked for the main method thread or "system"
* group threads created/set up by the VM. Any new functionality added
* to this method in the future may have to also be added to the VM.
*
* A zero status value corresponds to state "NEW".
*/
if (threadStatus != 0)
throw new IllegalThreadStateException();
/* Notify the group that this thread is about to be started
* so that it can be added to the group's list of threads
* and the group's unstarted count can be decremented. */
group.add(this);
boolean started = false;
try {
start0();
started = true;
} finally {
try {
if (!started) {
group.threadStartFailed(this);
}
} catch (Throwable ignore) {
/* do nothing. If start0 threw a Throwable then
it will be passed up the call stack */
}
}
}
private native void start0();
- コード例は、ネイティブメソッドの記述方法を示しています
- ネイティブ識別子は、抽象を除いて、他のjava識別子と組み合わせて使用できることに注意してください。
/**
* 本地方法
*/
public class IHaveNatives {
//abstract 没有方法体
public abstract void abstractMethod(int x);
//native 和 abstract不能共存,native是有方法体的,由C语言来实现
public native void Native1(int x);
native static public long Native2();
native synchronized private float Native3(Object o);
native void Native4(int[] array) throws Exception;
}
2.なぜネイティブメソッドを使用するのですか?
Javaは非常に使いやすいですが、一部のレベルのタスクはJavaで簡単に実行できないか、プログラムの効率が非常に心配な場合に問題が発生します。
2.1Java環境との相互作用
- JavaアプリケーションがJavaの外部のハードウェア環境と対話する必要がある場合があります。これが、ネイティブメソッドが存在する主な理由です。情報を交換するための特定のハードウェアまたはオペレーティングシステムとして、 Javaおよび基礎となるシステムケースのいくつかについて考える必要がある場合があります。
- ネイティブメソッドはまさにそのような通信メカニズムです。非常に簡潔なインターフェイスを提供し、Javaアプリケーションの面倒な詳細を理解する必要はありません。
2.2オペレーティングシステムとの相互作用
- JVMは、Java言語自体とランタイムライブラリをサポートします。これは、Javaプログラムが存在するプラットフォームであり、インタプリタ(バイトコードを解釈する)と、ネイティブコードに接続されたいくつかのライブラリで構成されます。
- ただし、それは結局のところ完全なシステムではなく、多くの場合、基盤となるシステムのサポートに依存しています。これらの基盤となるシステムは、多くの場合、強力なオペレーティングシステムです。
- ネイティブメソッドを使用することで、Javaを使用してjreと基盤となるシステム間の相互作用を実現することができ、JVMの一部でさえCで記述されていました。
- また、Java言語自体がカプセル化を提供しないオペレーティングシステムの機能の一部を使用する場合は、ネイティブメソッドも使用する必要があります。
2.3SunのJava
- SunのインタープリターはCで実装されているため、通常のCのように外の世界と対話できます。Jreは主にJavaで実装されており、いくつかのローカルメソッドを介して外部と相互作用します。
- 例:メソッドのクラス
java.lang.Thread
はsetPriority()
Javaで実装されていますが、これはローカルメソッドsetPriority0()での実装呼び出しのタイプです。このネイティブメソッドはCで実装され、Windows 95プラットフォームのJVM内に埋め込まれます。このネイティブメソッドは、最終的にWin32 setpriority()APIを呼び出します。 - これは、JVMによって直接提供されるローカルメソッドの特定の実装です。多くの場合、ローカルメソッドは外部動的リンクライブラリ(外部動的リンクライブラリ)によって提供され、JVMによって呼び出されます。
3.現在の状況
現在、この方法は、Javaプログラムを介してプリンターを駆動したり、Javaシステムを介して生産設備を管理したりするなど、エンタープライズアプリケーションでは比較的まれなハードウェア関連のアプリケーションを除いて、ますます使用されていません。異種ドメイン間の通信は、ソケット通信が使用できる、Webサービスも使用できるなど、非常に発達しているため、ここではこれ以上紹介しません。