JVM_04ネイティブメソッドインターフェイス

ローカルメソッド

簡単に言うと、ネイティブメソッドは非Javaコードを使用するJavaインターフェイスであり、ネイティブメソッドはJavaメソッドです。メソッドの実装はCなどの非Java言語で実装されます。この機能はJavaに固有のものではありません。他の多くのプログラミング言語にもこのメカニズムがあります。たとえば、C ++では、extern "C"を使用して、C ++コンパイラにC関数を呼び出すように指示できます。
ネイティブメソッドを定義する場合、実装本体は外部の非Java言語によって実装されるため、実装本体は提供されません(Javaインターフェイスの定義に似ています)。
ローカルインターフェイスの役割は、Java用のさまざまなプログラミング言語を統合することです。本来の目的は、C / C ++プログラムを統合することです。
識別子ネイティブは、抽象を除く他のすべての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;

}

ネイティブメソッドを使用する理由

Javaは非常に使いやすいですが、一部のレベルのタスクはJavaで実装するのが簡単ではありません。または、プログラムの効率が非常に心配な場合、問題が発生します。

  • Java環境の
    外部との相互作用JavaアプリケーションがJavaの外部の環境と相互作用する必要がある場合があります。これが、ネイティブメソッドが存在する主な理由です。
    Javaが、システムやハードウェアをワイプするなど、一部の低レベルシステムと情報を交換する必要がある状況について考えることができます。ローカルメソッドは一種の通信メカニズムです。非常に簡潔なインターフェイスを提供し、Javaアプリケーションの外部で面倒な詳細を理解する必要はありません。
  • オペレーティングシステムとの対話
    JVMは、Java言語自体とランタイムライブラリをサポートします。これは、Javaプログラムが存在するプラットフォームであり、インタプリタ(バイトコードを解釈する)と、ネイティブコードに接続されたいくつかのライブラリで構成されます。ただし、それは結局のところ完全なシステムではなく、多くの場合、いくつかの基盤となるシステムのサポートに依存しています。これらの基盤となるシステムは、多くの場合、強力なオペレーティングシステムです。ネイティブメソッドを使用することで、javaを使用してjreと基盤となるシステム間の相互作用を実現することができ、jvmの一部でさえCで記述されていました。また、Java言語自体がカプセル化を提供しないオペレーティングシステム機能を使用する場合は、ローカルメソッドも使用する必要があります。
  • SunのJavaSun
    のインタプリタはCで実装されているため、通常のCのように外の世界と対話できます。Jreは主にJavaで実装されており、いくつかのローカルメソッドを介して外部と相互作用します。例:クラスjava.lang.ThreadのsetPriority()メソッドはJavaで実装されていますが、クラスのローカルメソッドsetPriority0()への呼び出しを実装しています。このネイティブメソッドはCで実装され、JVM内に埋め込まれます。Windows95プラットフォームでは、このネイティブメソッドは最終的にWin32 SetProority()APIを呼び出します。これは、JVMによって直接提供されるローカルメソッドの特定の実装です。多くの場合、ローカルメソッドは外部ダイナミックリンクライブラリ(外部ダイナミックリンクライブラリ)によって提供され、JVMによって呼び出されます。

現状

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

おすすめ

転載: blog.csdn.net/qq_43141726/article/details/114585466