为什么某些 Java 库方法委托给具有几乎相同签名的本机方法?
在深入研究了JRE库的源代码之后,我注意到一个奇怪的通用代码结构,如下所示:
public int foo(double bar) {
return foo0(bar);
}
private native int foo0(double bar);
此代码模式的目的是什么,为什么使用它而不是简单地将基础本机方法公开为公共方法?
在深入研究了JRE库的源代码之后,我注意到一个奇怪的通用代码结构,如下所示:
public int foo(double bar) {
return foo0(bar);
}
private native int foo0(double bar);
此代码模式的目的是什么,为什么使用它而不是简单地将基础本机方法公开为公共方法?
本机版本只是一个实现细节。
此模式将方法的公共接口与实际实现分开。
我看到至少5个理由说明为什么这是有用的:
你可能会发现更多的优势。
private native int foo(double bar);
因此,最终这必须调用C++函数来实现。特别是,它最终会调用一个名为以下内容的函数:
Java_MyClass_foo
如果有多个具有不同签名的本机 foo 方法,会发生什么情况?并发症。如果这样做,Java 会将类型信息添加到它查找的方法的名称中。但是,如果您坚持使用非重载方法,则更容易。
public int foo(double bar) {
return foo0(bar);
}
private native int foo0(double bar);
foo0
已经被赋予了一个唯一的名称,永远不应该有理由再添加一个。这使得C++的实现变得简单,它永远不必处理损坏的名称。即使 foo 最终获得了重载,它也会调用而不是,C++ JNI 实现也不必处理重载的额外复杂性。foo0
foo1
foo0