在深入研究JRE库的源代码之后,我注意到一个奇怪的常见代码结构,如下所示:
public int foo(double bar) {
return foo0(bar);
}
private native int foo0(double bar);
Run Code Online (Sandbox Code Playgroud)
这个代码模式的目的是什么,为什么使用它而不是简单地将底层本机方法公开为公共方法?
Oli*_*myn 47
本机版本只是一个实现细节.
此模式将方法的公共接口与实际实现分开.
我看到至少5个有用的原因:
您可能会发现更多优势.
Win*_*ert 14
private native int foo(double bar);
Run Code Online (Sandbox Code Playgroud)
因此,最终必须为其实现调用C++函数.特别是,它最终会调用一个名称类似的函数:
Java_MyClass_foo
Run Code Online (Sandbox Code Playgroud)
如果有多个具有不同签名的本机foo方法会发生什么?并发症.如果这样做,Java会将类型信息添加到它查找的方法的名称中.但是如果你坚持使用非重载方法,那就简单多了.
public int foo(double bar) {
return foo0(bar);
}
private native int foo0(double bar);
Run Code Online (Sandbox Code Playgroud)
foo0已被赋予一个独特的名称,永远不应该有理由添加另一个foo0.这使得C++的实现变得简单,它永远不必处理受损的名称.即使foo最终获得了重载,它也会调用foo1而不是foo0C++ JNI实现将不必处理重载的额外复杂性.
| 归档时间: |
|
| 查看次数: |
3687 次 |
| 最近记录: |