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

nik*_*iks 70 java native

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

Cir*_*四事件 129

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));
    }
}
Run Code Online (Sandbox Code Playgroud)

Main.c:

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

JNIEXPORT jint JNICALL Java_Main_intMethod(
    JNIEnv *env, jobject obj, jint i) {
  return i * i;
}
Run Code Online (Sandbox Code Playgroud)

编译并运行:

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
Run Code Online (Sandbox Code Playgroud)

输出:

4
Run Code Online (Sandbox Code Playgroud)

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

所以很明显它允许你:

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

这可以用于:

  • 使用更好的CPU汇编指令(不是CPU便携式)在关键部分编写更快的代码
  • 进行直接系统调用(不是OS便携式)

与低便携性的权衡.

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

GitHub上的示例供您玩.

  • 它工作得很好.....你做得很好兄弟...我已经尝试过这么多教程,但没有得到一个有效的例子 (3认同)
  • @dom谢谢!我想这是因为它是高度依赖系统的东西.这就是为什么我总是说测试发行版的版本:-) (2认同)
  • 在`jni.h`中定义的@niks东西.看起来像推荐/最便携的方式.不知道它在哪里记录,会欣赏一个链接. (2认同)

Lau*_*ves 45

该方法以"本机"代码实现.也就是说,代码不能在JVM中运行.它通常用C或C++编写.

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

  • 不完全是.如果在名为"com.example.Foo"的类中有一个名为"forName"的方法,那么将被调用的C函数将被命名为"Java_com_example_Foo_forName".然后该函数可以调用系统调用.有关详细信息,请参阅http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/design.html. (2认同)
  • 假设我们想调用一些系统函数,`baz`.首先,使用本机方法`bar`创建一个名为`com.example.Foo`的类.然后编写一个C函数,`Java_com_example_Foo_bar`,它调用`baz`.编译并将C函数链接到共享库(例如:`libquux.so`或`quux.dll`).在调用`bar`本机方法之前,您的Java代码必须调用`System.loadLibrary("quux")`(否则将抛出`UnsatisfiedLinkError`).在这个例子中,只要允许,我就会使名称不同,但实际上,类和库的名称和函数以及方法的名称相同. (2认同)

Pet*_*rey 15

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

理想情况下,完全没有.实际上,Java中没有某些功能,您必须调用一些C代码.

这些方法用C代码实现.

  • doe ==代码?:) (3认同)

Cjo*_*Cjo 6

Java本机代码必需品:

  • h/w访问和控制.
  • 使用商业软件和系统服务[h/w相关].
  • 使用没有或不能移植到Java的传统s/w.
  • 使用本机代码执行时间关键任务.

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