JNI真的需要接口指针来提供多个版本的JNI函数表吗?



在JNI规范上,它说:

JNI 接口的组织方式类似于C++虚拟功能表或 COM 接口。使用接口表而不是硬连线函数条目的优点是 JNI 命名空间与本机代码分开。一个虚拟机可以轻松提供多个版本的 JNI 函数表。例如,VM 可能支持两个 JNI 函数表:

一个进行彻底的非法参数检查,适合调试; 另一个执行 JNI 规范要求的最少检查量,因此效率更高。

但真的需要吗?毕竟,接口指针是指向指针的指针。它的成本更高,性能下降。

不,他们(Sun(本可以想出一些其他的设计。由于历史原因,这个 JniEnv 与我们同在,并且确实对 JNI 开销做出了贡献,尽管并不重要。

这个想法是让 Java 端控制是否在每个线程的运行时使用调试函数集。我不相信这个想法曾经帮助过某人调试他们的原生代码。

请注意,C++包装器大大减少了麻烦(当然,这只是语法;开销不会消失(。

最新更新