在玩这个谜题(这是一个Java关键字问答游戏)时,我遇到了原生关键字。
Java中的本机关键字用于什么?
在玩这个谜题(这是一个Java关键字问答游戏)时,我遇到了原生关键字。
Java中的本机关键字用于什么?
当前回答
它标记了一个方法,它将在其他语言中实现,而不是在Java中。它与JNI (Java本机接口)一起工作。
在过去,本机方法用于编写性能临界区,但随着Java的速度越来越快,这种方法现在不太常见了。当前需要本机方法时
您需要从Java调用用其他语言编写的库。 您需要访问只能通过其他语言(通常是C语言)访问的系统或硬件资源。实际上,许多与真实计算机交互的系统函数(例如磁盘和网络IO)只能这样做,因为它们调用本机代码。
另请参阅 Java本机接口规范
其他回答
本机关键字应用于方法,以指示该方法是使用JNI (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原生方法要点
NATIVE是非访问修饰符。它只能应用于METHOD。 它表示方法或代码的平台依赖的实现。
正如SLaks回答的那样,native关键字用于调用本机代码。
它也被GWT用来实现javascript方法。
它标记了一个方法,它将在其他语言中实现,而不是在Java中。它与JNI (Java本机接口)一起工作。
在过去,本机方法用于编写性能临界区,但随着Java的速度越来越快,这种方法现在不太常见了。当前需要本机方法时
您需要从Java调用用其他语言编写的库。 您需要访问只能通过其他语言(通常是C语言)访问的系统或硬件资源。实际上,许多与真实计算机交互的系统函数(例如磁盘和网络IO)只能这样做,因为它们调用本机代码。
另请参阅 Java本机接口规范