1。ネイティブ方法とは何ですか
簡単に言えば、ネイティブメソッドは、Javaが非Javaコードを呼び出すインターフェイスです。ネイティブ方法はJavaメソッドです。この方法の実装は、Cなどの非Java言語によって実装されます。この機能はJavaに固有のものではありません。他の多くのプログラミング言語には、このメカニズムがあります。たとえば、C ++では、Extern "C"を使用してC ++コンパイラにC関数を呼び出すように指示できます。
「ネイティブ方法は、Java以外のコードによって実装が提供されるJavaメソッドです。」
ネイティブメソッドを定義する場合、実装本体は提供されません(一部はJavaインターフェイスを定義するようなものです)。 、ここに例があります:
パッケージjava.lang;パブリッククラスオブジェクト{......パブリックファイナルネイティブクラス<?> getClass(); public Native int hashcode();保護されたネイティブオブジェクトclone()は、clonenotsupportedexceptionをスローします。パブリックファイナルネイティブvoid notify();パブリックファイナルネイティブvoid notifyall();パブリックファイナルネイティブボイド待機(長いタイムアウト)が中断されたエクセプトをスローします。 ......}識別子ネイティブは、要約を除き、他のすべてのJava識別子で使用できます。ネイティブはこれらの方法に実装機関があることを暗示するため、これは合理的ですが、これらの実装体は非ジャバですが、抽象的なは明らかに、これらの方法に実装機関がないことを示しています。ネイティブおよびその他のJava識別子を使用する場合、それらの意味は非ネイティブな方法の意味と変わりません。
ネイティブメソッドメソッドは、非プライティブタイプを含むJavaタイプを返すことができ、例外コントロールを実行することもできます。これらのメソッドの実装は、例外を作成してスローすることができます。これはJavaの方法に非常に似ています。
ネイティブ方法の存在は、これらのローカル方法を呼び出す他のクラスに影響を与えません。実際、これらのメソッドを呼び出す他のクラスは、それがローカルメソッドを呼び出していることさえ知らない。 JVMは、ローカルメソッドを呼び出すすべての詳細を制御します。
ローカルメソッドを含むクラスが継承されている場合、サブクラスはローカルメソッドを継承し、Javaでメソッドを書き直すことができます(これは少し奇妙に思えます)。同様に、局所的な方法がFIANLによって識別された場合、それが継承された後に書き直すことはできません。
ローカルな方法は、JVMを効果的に拡張するため、非常に便利です。実際、私たちが書いているJavaコードは、ローカル方法を使用しています。 SunのJavaの同時実行(マルチスレッド)メカニズムの実装では、オペレーティングシステムとの多くの接触点がローカル方法を使用しているため、JavaプログラムはJavaランタイムの境界を超えています。ローカルな方法では、Javaプログラムはアプリケーションレベルのタスクを実行できます。
2。使い方
ネイティブキーワードは、その変更方法が元の方法であることを示しています。メソッドの対応する実装は、現在のファイルではなく、他の言語(CやC ++など)に実装されたファイルにあります。 Java言語自体は、オペレーティングシステムの基礎となる層にアクセスして操作することはできませんが、JNIインターフェイスを使用して他の言語を呼び出して、基礎となる層へのアクセスを実現できます。
JNIは、Javaソフトウェア開発キット(SDK)の一部であるネイティブプログラミングインターフェイスであるJavaネイティブインターフェイスです。 JNIでは、Javaコードが他の言語で記述されたコードとコードのベースを使用できます。 Invocation API(JNIの一部)を使用して、Java仮想マシン(JVM)をネイティブアプリケーションに埋め込み、プログラマーがネイティブコード内からJavaコードを呼び出すことができます。
ただし、外部Javaへの呼び出しは通常、他のプラットフォームに移植することはできず、セキュリティの例外もアプレットで提起する場合があります。ネイティブコードを実装すると、Javaアプリケーションが100%純粋なJavaテストに合格することができなくなります。ただし、ローカルコールを実行する必要がある場合、考慮すべきいくつかのガイドラインがあります。
1.すべてのローカルメソッドを、単一のDLLを呼び出すクラスにカプセル化します。各ターゲットオペレーティングシステムプラットフォームについて、適切なプラットフォームに固有のDLLのバージョンを使用できます。これにより、ローカルコードの影響が最小限に抑えられ、後で必要な移植の問題を考慮に入れることができます。
2。ローカル方法はできるだけ単純です。ローカルメソッドのサードパーティ(Microsoftを含む)ランタイムDLLへの依存を最小限に抑えるようにしてください。 DLLとアプリケーションをロードするために必要なオーバーヘッドを最小限に抑えるために、ローカルメソッドをできるだけ独立させます。ランタイムDLLが必要な場合は、アプリケーションに提供する必要があります。
JNIの書き込み手順は次のとおりです。
JavaでローカルCプログラムを呼び出す簡単な例を次に示します。
a。 helloworld.javaクラスを書きます
class helloworld {public native void hello(); static {system.loadLibrary( "hello");} public static void main(string [] args){new helloworld()。hello();}}}b。翻訳
Javac Helloworld.java
c。 .hファイルを生成します
Javah -Jni Helloworld
生成されたコンテンツは次のとおりです。
/*このファイルを編集しないでください - それはマシン生成されたマシンです*/#クラスHelloworldの<jni.h>/*ヘッダーを含めます*/#ifndef _included_hellodeorld#define _included_hehellowld#ifdef __cplusplusexern "c" {#endif/** class* vid*/jn void:() jnicall java_helloworld_hello(jnienv *、jobject);#ifdef __cplusplus}#endif#endif最初のパラメーターは、JNIメソッドを呼び出すときに使用するJNI環境ポインターです。 2番目のパラメーターは、このJavaコードにインスタンス化されたJavaオブジェクトHelloworldのハンドルです。他のパラメーターは、メソッド自体のパラメーターです
DC実装
#include <jni.h> #include "helloworld.h" #include <stdio.h> jniexport void jnicall java_helloworld_hello(jnienv *env、jobject obj){printf( "hello world!/n"); return;}その中で、最初の行は、JNIENVとJobjectの定義を含むJNI.Hファイル(%Java_home%/Include Directory)を導入することです。
e。 C実装をコンパイルします
ここでは、Windowsを例として使用すると、DLLファイルを生成する必要があります。 Save Helloworldimpl.cフォルダーの下で、VCコンパイラを使用して作成します。
cl -i%java_home%/include -i%java_home%/include/win32 -ld helloworldimp.c -fehello.dll
注:生成されたdllファイル名は、オプション-feの後に構成されます、ここにhelloです。もちろん、ここで変更した後、そこで変更する必要があります。さらに、-i%java_home%/include -i%java_home%/include/win32パラメーターを追加する必要があります。
f。プログラムを実行します
JavaHelloworldは大丈夫です!
上記は、Javaのネイティブキーワードの詳細な紹介であり、すべての人の学習に役立つことを願っています。