Java中的本机方法是什么,应该在哪里使用它们?

2022-08-31 13:15:35

本机方法与抽象方法具有相同的语法,但它在哪里实现?


答案 1

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));
    }
}

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

在 Ubuntu 14.04 上使用 Oracle JDK 1.8.0_45 进行测试。

因此,很明显,它允许您:

  • 使用来自Java的任意汇编代码调用已编译的动态加载库(此处用C编写)
  • 并将结果返回到 Java 中

这可用于:

  • 在关键部分编写更快的代码,具有更好的CPU汇编指令(不是CPU可移植的)
  • 进行直接系统调用(非操作系统可移植)

权衡了较低的便携性。

您也可以从C调用Java,但您必须首先在C中创建一个JVM:如何从C++调用Java函数?

GitHub 上的示例供您使用。


答案 2

该方法是在“本机”代码中实现的。也就是说,不在 JVM 中运行的代码。它通常用C或C++编写。

本机方法通常用于与用其他编程语言编写的系统调用或库进行交互。


推荐