1. ホーム
  2. java

Javaにおけるネイティブメソッドとは何か、どこで使うべきか?[重複しています]。

2023-10-03 11:44:33

質問

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

どのように解決するのですか?

Javaにおけるネイティブメソッドとはどのようなもので、どこで使うべきものなのでしょうか?

小さな例を見ていただければ、一目瞭然です。

メイン.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));
    }
}

メイン.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

Ubuntu 14.04 で、Oracle JDK 1.8.0_45 でテストしました。

ということで、それが可能であることは明らかです。

  • コンパイルされ動的にロードされたライブラリ(ここではCで書かれています)を、Javaから任意のアセンブリコードで呼び出す。
  • そして結果をJavaに戻す

これは、次のように使うことができる。

  • より良い CPU アセンブリ命令 (CPU ポータブルではない) を使用して、クリティカル セクションでより高速なコードを記述する。
  • 直接システムコールを行う (OS 移植不可)

移植性の低下というトレードオフを伴う

C言語からJavaを呼び出すことも可能ですが、まずC言語でJVMを作成する必要があります。 C++からJavaの関数を呼び出すには?

GitHubでの例 を使って遊んでみてください。