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

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

112532 次浏览

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

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

这些方法是用 C 代码实现的。

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

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

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

Java 本机代码必需品:

  • H/w 访问和控制。
  • 使用商业设施及系统服务。
  • 使用没有或不能移植到 Java 的遗留 s/w。
  • 使用本机代码执行时间紧迫的任务。

希望以下几点能回答你的问题:)

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: 如何从 C + + 调用 Java 函数?中创建一个 JVM

你可以在 GitHub 上玩的示例。