在玩这个谜题(这是一个Java关键字问答游戏)时,我遇到了原生关键字。

Java中的本机关键字用于什么?


当前回答

本机关键字应用于方法,以指示该方法是使用JNI (Java本机接口)在本机代码中实现的。

其他回答

实现本机代码的函数被声明为本机。

Java本机接口(JNI)是一个编程框架,它使运行在Java虚拟机(JVM)中的Java代码能够调用本机应用程序(特定于硬件和操作系统平台的程序)和用其他语言(如C、c++和汇编)编写的库,并被它们调用。

http://en.wikipedia.org/wiki/Java_Native_Interface

本机是java中的关键字,表示平台依赖。 本机方法充当Java(JNI)与其他编程语言之间的接口。

Native是Java中的一个关键字,用于使未实现的结构(方法)成为抽象的,但它将是依赖于平台的,例如本机代码,并从本机堆栈而不是Java堆栈执行。

Java本机方法为Java代码调用OS本机代码提供了一种机制,无论是出于功能原因还是性能原因。

例子:

rutime (github上的源代码)包含以下本机方法定义

606  public native int availableProcessors();
617  public native long freeMemory();
630  public native long totalMemory();
641  public native long maxMemory();
664  public native void gc();

在OpenJDK中相应的Runtime.class文件中,位于JAVA_HOME/jmods/java.base.jmod/classes/java/lang/Runtime.class中包含这些方法,并标记为ACC_NATIVE (0x0100),这些方法不包含Code属性,这意味着这些方法在Runtime.class文件中没有任何实际的编码逻辑:

方法13 availableProcessors:标记为本机,没有Code属性 方法14 freeMemory:标记为本机,没有Code属性 方法15 totalMemory:标记为本机,没有Code属性 方法16 maxMemory:标记为本机,没有Code属性 方法17 gc:标记为本机,没有Code属性

实际上,编码逻辑在相应的Runtime.c文件中:

42  #include "java_lang_Runtime.h"
43
44  JNIEXPORT jlong JNICALL
45  Java_java_lang_Runtime_freeMemory(JNIEnv *env, jobject this)
46  {
47      return JVM_FreeMemory();
48  }
49
50  JNIEXPORT jlong JNICALL
51  Java_java_lang_Runtime_totalMemory(JNIEnv *env, jobject this)
52  {
53      return JVM_TotalMemory();
54  }
55
56  JNIEXPORT jlong JNICALL
57  Java_java_lang_Runtime_maxMemory(JNIEnv *env, jobject this)
58  {
59      return JVM_MaxMemory();
60  }
61
62  JNIEXPORT void JNICALL
63  Java_java_lang_Runtime_gc(JNIEnv *env, jobject this)
64  {
65      JVM_GC();
66  }
67  
68  JNIEXPORT jint JNICALL
69  Java_java_lang_Runtime_availableProcessors(JNIEnv *env, jobject this)
70  {
71      return JVM_ActiveProcessorCount();
72  }

并将这些C代码编译成libjava。so (Linux)或libjava.dll (Windows)文件,位于JAVA_HOME/jmods/java.base.jmod/lib/libjava.so:

参考

Java原生方法要点

直接来自Java语言规范:

本机方法是在依赖于平台的代码中实现的,通常是用其他编程语言(如C、c++、FORTRAN或汇编语言)编写的。本机方法的主体仅以分号形式给出,表示省略了实现,而不是一个块。