在深入研究JRE库的源代码之后,我注意到一个奇怪的常见代码结构,如下所示:
public int foo(double bar) {
return foo0(bar);
}
private native int foo0(double bar);
此代码模式的目的是什么,为什么使用它而不是简单地将底层本机方法公开为公共方法?
答案 0 :(得分:47)
原生版本只是一个实现细节。
此模式将方法的公共接口与实际实现分开。
我至少看到了5个有用的原因:
您可能会发现更多优势。
答案 1 :(得分:14)
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
已被赋予唯一名称,永远不应该有理由添加另一个foo0
。这使得C ++的实现变得简单,它永远不必处理受损的名称。即使foo最终获得了重载,它也会调用foo1
而不是foo0
,并且C ++ JNI实现将不必处理重载的额外复杂问题。