エントリから熟練した(7)ネイティブメソッドインターフェイスまでのJVM

1つのローカルメソッドインターフェイス

データ領域のネイティブメソッドがスタックする前にJava仮想マシンが実行されていると言えば、データ領域の外側JNI(Java Native Interface)のネイティブメソッドインターフェイスの略語と呼ばれるものが実行されているとします

JVMアーキテクチャの概要

ローカルメソッドとは何ですか?

  1. 簡単に言えば、ネイティブメソッドは非JavaコードインターフェイスへのJava呼び出しです

  2. ネイティブメソッドはJavaメソッドです。メソッドはCなどの非Java言語で実装されます。

  3. この機能はJavaに固有のものではありません。他の多くのプログラミング言語にもこのメカニズムがあります。たとえば、C ++では、externを使用してC ++コンパイラにC関数を呼び出すように指示できます。

  4. 「ネイティブメソッドは、実装が非Javaコードによって提供されるJavaメソッドです。」(ネイティブメソッドは非Javaメソッドであり、その特定の実装は非Javaコードの実装です。)

  5. ネイティブメソッドを定義する場合、実装本体はJava以外の言語によって外部で実装されるため、実装本体は提供されません(Javaインターフェイスの定義に似ています)。

  6. ネイティブインターフェイスの役割は、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環境との相互作用

  1. JavaアプリケーションがJavaの外部のハードウェア環境と対話する必要がある場合があります。これが、ネイティブメソッドが存在する主な理由です。情報を交換するための特定のハードウェアまたはオペレーティングシステムとして Javaおよび基礎となるシステムケースのいくつかについて考える必要がある場合があります。
  2. ネイティブメソッドはまさにそのような通信メカニズムです。非常に簡潔なインターフェイスを提供し、Javaアプリケーションの面倒な詳細を理解する必要はありません。

2.2オペレーティングシステムとの相互作用

  1. JVMは、Java言語自体とランタイムライブラリをサポートします。これは、Javaプログラムが存在するプラットフォームであり、インタプリタ(バイトコードを解釈する)と、ネイティブコードに接続されたいくつかのライブラリで構成されます。
  2. ただし、それは結局のところ完全なシステムではなく、多くの場合、基盤となるシステムのサポートに依存しています。これらの基盤となるシステムは、多くの場合、強力なオペレーティングシステムです。
  3. ネイティブメソッドを使用することで、Javaを使用してjreと基盤となるシステム間の相互作用を実現することができ、JVMの一部でさえCで記述されていました。
  4. また、Java言語自体がカプセル化を提供しないオペレーティングシステムの機能の一部を使用する場合は、ネイティブメソッドも使用する必要があります。

2.3SunのJava

  1. SunのインタープリターはCで実装されているため、通常のCのように外の世界と対話できます。Jreは主にJavaで実装されており、いくつかのローカルメソッドを介して外部と相互作用します。
  2. 例:メソッドのクラスjava.lang.ThreadsetPriority()Javaで実装されていますが、これはローカルメソッドsetPriority0()での実装呼び出しのタイプです。このネイティブメソッドはCで実装され、Windows 95プラットフォームのJVM内に埋め込まれます。このネイティブメソッドは、最終的にWin32 setpriority()APIを呼び出します。
  3. これは、JVMによって直接提供されるローカルメソッドの特定の実装です。多くの場合、ローカルメソッドは外部動的リンクライブラリ(外部動的リンクライブラリ)によって提供され、JVMによって呼び出されます。

3.現在の状況

現在、この方法は、Javaプログラムを介してプリンターを駆動したり、Javaシステムを介して生産設備を管理したりするなど、エンタープライズアプリケーションでは比較的まれなハードウェア関連のアプリケーションを除いて、ますます使用されていません。異種ドメイン間の通信は、ソケット通信が使用できる、Webサービスも使用できるなど、非常に発達しているため、ここではこれ以上紹介しません。

おすすめ

転載: blog.csdn.net/BeiisBei/article/details/108940696