web-dev-qa-db-ja.com

Javaのネイティブメソッドとは何で、どこで使用する必要がありますか?

ネイティブメソッドの構文は抽象メソッドと同じですが、どこに実装されていますか?

70
niks

Javaのネイティブメソッドとは何で、どこで使用する必要がありますか?

小さな例を見ると、明らかになります:

Main.Java

public class Main {
    public native int intMethod(int i);
    public static void main(String[] args) {
        System.loadLibrary("Main");
        System.out.println(new Main().intMethod(2));
    }
}

Main.c

#include <jni.h>
#include "Main.h"

JNIEXPORT jint JNICALL Java_Main_intMethod(
    JNIEnv *env, jobject obj, jint i) {
  return i * i;
}

コンパイルして実行

javac Main.Java
javah -jni Main
gcc -shared -fpic -o libMain.so -I${Java_HOME}/include \
  -I${Java_HOME}/include/linux Main.c
Java -Djava.library.path=. Main

出力

4

Oracle JDK 1.8.0_45を使用してUbuntu 14.04でテスト済み。

したがって、次のことができることは明らかです。

  • javaの任意のアセンブリコードを使用して、コンパイル済みの動的にロードされたライブラリ(ここではCで記述)を呼び出します。
  • 結果をJavaに戻す

これは次の用途に使用できます。

  • より重要なCPUアセンブリ命令を使用して、クリティカルセクションでより高速なコードを記述します(CPUポータブルではありません)
  • 直接システムコールを行います(OSポータブルではありません)

可搬性が低いというトレードオフがあります。

CからJavaを呼び出すこともできますが、最初にCでJVMを作成する必要があります。 C++からJava関数を呼び出す方法

GitHubの例 一緒に遊ぶ。

このメソッドは「ネイティブ」コードで実装されます。つまり、JVMで実行されないコード。通常、CまたはC++で記述されています。

ネイティブメソッドは通常、他のプログラミング言語で記述されたシステムコールまたはライブラリとのインターフェイスに使用されます。

45

ネイティブメソッドをどこで使用するかを知りたい

理想的には、まったくありません。実際には、いくつかの機能はJavaで使用できないため、Cコードを呼び出す必要があります。

メソッドはCコードで実装されます。

15
Peter Lawrey

Javaネイティブコードの必需品:

  • ハードウェアアクセスおよび制御。
  • 商用ソフトウェアおよびシステムサービスの使用[ハードウェア関連]。
  • javaに移植されていない、または移植できないレガシーソフトウェアの使用。
  • ネイティブコードを使用して、タイムクリティカルなタスクを実行します。

これらのポイントがあなたの質問に答えることを望みます:)

6
Cjo

ネイティブメソッドを使用すると、JavaコードでCやC++などの他の言語のコードを使用できます。 Javaが必要な機能を提供しない場合に使用します。たとえば、方程式を計算してその折れ線グラフを作成するプログラムを作成している場合、Javaを使用します。これは、Javaが最適な言語だからです。しかし、Cにも精通しています。プログラム私は本当に複雑な方程式を計算する必要があります。 C++の一部を知っていて、C++がJavaよりもはるかに高速であることを知っているので、このためにネイティブメソッドを使用します。また、別のプログラムまたはデバイスとやり取りしたいとします。 C++にはポインターと呼ばれるものがあるため、ネイティブメソッドも使用します。

4
Zac