ネイティブに初めて会ったのは、java.lang.objectソースコードのハッシュコードメソッドです。
public Native int hashcode();
なぜネイティブがいるのですか?これが私が学びたいことです。だから私は以下のネイティブを要約したいと思います。
1.ネイティブ、つまりJNI、Javaネイティブインターフェイスを理解してください
すべての言語が純粋であることを望んでいます。たとえば、特定のソリューションを解決したい場合は、この言語で書くだけです。 Javaプラットフォームには、ユーザーがJavaネイティブインターフェイス(Javaローカルインターフェイス)と呼ばれるローカルCコードと相互運用するAPIがあります。
2。JavaのCの「Hello、jni」に電話してください
仕事を辞めるのに便利な手順に従う必要があります。
1.ネイティブメソッドとロードライブラリメソッドのロードライブラリを含むJavaクラスを作成します。 Hellonative.javaコードは次のとおりです。
public class eLnonative {static {system.loadLibrary( "hellonative"); } public static native void sayshello(); @suppresswarnings( "static-access")public static void main(string [] args){new hellonative()。sayhello(); }}最初に注意すべきことはネイティブの方法であり、ロードライブラリも後で機能します。ネイティブキーワードは、このメソッドが外部から定義されていることをコンパイラ(実際にはJVM)に伝え、ここではこのコードを直接実行する場合、JVMは「Java例外が発生した」と言います。コンソール出力は次のとおりです。
Exception in thread "main" java.lang.UnsatisfiedLinkError: no HelloNative in java.library.path at java.lang.ClassLoader.loadLibrary(Unknown Source) at java.lang.Runtime.loadLibrary0(Unknown Source) at java.lang.System.loadLibrary(Unknown Source) at HelloNative.<clinit>(HelloNative.java:5)
これは、プログラムがそれを使用するときであり、仮想マシンはSayhelloを見つける方法がわからないと言います。以下に手動で書くことができるので、メイソンが使用するのは自然です
2。javahを実行して、メソッドを含むc宣言ヘッダーファイルを取得します。
図に示されているように、hellonative.java、単にJavac Javahを置きます
次のヘロネティブを手に入れました。ファイル:
/ *このファイルを編集しないでください - それはマシン生成されたマシンです */#クラスヘロネーティブの<jni.h>/ *ヘッダーを含む */#ifndef _included_hellonative#define _included_hellonative __cplusplusextern "c" {#endif/ * * class * part */jhello * in vaid vaid * jnicall java_hellonative_sayhello(jnienv *、jclass); #ifdef __cplusplus}#endif#endifJni.hこのファイル、in /%java_home%が含まれます
3.ヘッダーファイルに従ってローカルメソッドを実装するには、Cを書き込みます。
ここでは、次のようにこのSayhelloメソッドを実装するだけです。
#include "hellonative.h" #include <stdio.h> jniexport void jnicall java_hellonative_sayhello {printf( "hello、jni"); }4. DLL共有ライブラリを生成し、Javaプログラムをロードして呼び出します。
Windowsでは、Mingw GCCは次のように実行されます
gcc -m64 -wl、 - add -stdcall -alias -i "c:/java/jdk1.7.0_71/include" -i "c:/program files/java/jdk1.7.0_71/include/include/include/win32" -s -shared -o hereonative.dll hellonati
-M64は、生成されたDLLライブラリが64ビットであることを意味します。その後、ヘロネティブを実行します:
Javaヘロナティブ
最後に、コンソールが次のように印刷されることがわかります。
こんにちは、Jni
3。JNIコールCフローチャート
4。その他の紹介
ネイティブは、C ++と共同開発されたときに使用されます!自分でJavaを開発する必要はありません!
ネイティブキーワードを使用して、この方法がネイティブ関数であることを示します。つまり、この方法はC/C ++言語で実装され、DLLにコンパイルされ、Javaによって呼び出されます。
これらの関数の実装本体はJDKのソースコードに含まれておらず、それらを表示しないでください。また、さまざまなプラットフォームでも異なります。これは、Javaの根本的なメカニズムでもあります。実際、Javaはさまざまなプラットフォームでさまざまなネイティブ方法を呼び出して、オペレーティングシステムへのアクセスを実現しています。
1.ネイティブは、他の言語(C ++など)と協力するために使用されます。つまり、ネイティブ機能の実装はJavaでは記述されていません。
2。javaはないので、そのソースコードについて心配しないでください、ハハ
ネイティブとは、オペレーティングシステムに通知することを意味します。
私はそれを使いたいので、あなたは私のためにこの機能を実装する必要があります。
したがって、ネイティブキーワードの関数はオペレーティングシステムによって実装され、Javaは呼び出されます。
Javaはクロスプラットフォーム言語です。それはクロスプラットフォームであるため、支払われる価格は、基礎となる層の何らかの制御を犠牲にすることです。基礎となる層を制御するために、Javaは他の言語からの助けが必要です。これがネイティブの役割です。
Javaは完璧ではありません。実行速度の点で従来のC ++よりもはるかに遅いという事実に加えて、Javaは基礎となるオペレーティングシステム(システムハードウェアなど)に直接アクセスできません。このため、Javaはネイティブ方法を使用してJavaプログラムの機能を拡張します。
ネイティブ方法は、JavaプログラムとCプログラムの間のインターフェースと比較でき、その実装手順は次のとおりです。
1。Javaでネイティブ()メソッドを宣言してからコンパイルします。
2。Javahを使用して.hファイルを生成します。
3. .cppファイルを書き込み、ネイティブエクスポート方法を実装します。これには、2番目のステップに生成された.hファイルを含める必要があります(JDKを含むJNI.Hファイルも含まれていることに注意してください)。
4. 3番目のステップで.cppファイルを動的リンクライブラリファイルにコンパイルします。
5。System.LoadLibrary()メソッドを使用して、Javaのステップ4で生成された動的リンクライブラリファイルをロードします。このネイティブ()メソッドはJavaでアクセスできます。
Javaローカルメソッドが適用される状況
1.基礎となるホストプラットフォームの機能を使用するために、この機能にはJava APIを介してアクセスできません。
2。古いシステムにアクセスしたり、既存のライブラリを使用したりするために、このシステムまたはライブラリはJavaで書かれていません
3。プログラムのパフォーマンスを高速化するために、機密コードの期間がローカルメソッドとして実装されます。
上記の記事は、Javaにおけるネイティブキーワードの役割を包括的に理解していることが、私があなたと共有するすべてのコンテンツです。参照を提供できることを願っています。wulin.comをもっとサポートできることを願っています。