75

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

4

5 回答 5

142

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

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

所以很明显,它允许您:

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

这可用于:

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

以较低的便携性为代价。

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

GitHub 上的示例供您使用。

于 2015-03-27T22:22:46.560 回答
46

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

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

于 2013-09-19T16:59:11.127 回答
16

我想知道我们在哪里使用本机方法

理想情况下,一点也不。实际上,某些功能在 Java 中不可用,您必须调用一些 C 代码。

这些方法在 C 代码中实现。

于 2013-09-19T16:58:58.383 回答
6

Java本机代码必需品:

  • 硬件访问和控制。
  • 使用商业软件和系统服务[硬件相关]。
  • 使用尚未或不能移植到 Java 的遗留软件。
  • 使用本机代码执行时间紧迫的任务。

希望这些观点能回答你的问题:)

于 2014-11-09T06:02:45.983 回答
4

本机方法允许您在 Java 代码中使用来自其他语言(例如 C 或 C++)的代码。当 java 不提供您需要的功能时,您可以使用它们。例如,如果我正在编写一个程序来计算某个方程并创建它的折线图,我会使用 java,因为它是我最擅长的语言。但是,我也精通 C。说一部分我的程序我需要计算一个非常复杂的方程。我会为此使用本机方法,因为我知道一些 C++ 并且我知道 C++ 比 java 快得多,所以如果我用 C++ 编写我的方法会更快。另外,假设我想与另一个程序或设备进行交互。这也将使用本机方法,因为 C++ 有一个叫做指针的东西,它可以让我这样做。

于 2014-06-03T20:22:14.147 回答