[英]why loading JNI in java is done in static initializer?
在使用 JNI 的许多示例中,我看到类似的内容:
class SampleClass {
static {
System.loadLibrary("somelib");
}
...
}
这种特殊语法的目的是什么? 为什么要使用它(而不仅仅是在类构造函数或类似的东西中?
没有理由不这样做,但是通常您只想加载本机库一次。 实现这一目标的最简单方法是通过静态初始化程序。 否则,您需要实现自己的机制以防止它多次发生。 请参阅是否可以在 Java 中加载同一 DLL 的不同版本? 用于重新加载库。
另一个原因是您无法使用本机代码提供静态方法。
我想你会从书中得到最好的答案:
你可以在哪里阅读:
在调用本机方法print 之前,必须加载实现print 的本机库。 在这种情况下,我们在 HelloWorld 类的静态初始化程序中加载本机库。 Java 虚拟机在调用 HelloWorld 类中的任何方法之前会自动运行静态初始化程序,从而确保在调用打印本机方法之前加载本机库。
通常,没有什么可以阻止您在类的方法中加载库。 方法,那不是static
。 但在这种情况下,您必须确保在调用任何本机方法之前加载库(通过调用调用 load 或 loadLibrary 的方法)。
此外,如果您想加载另一个版本的库,而无需使用多个 ClassLoader,您始终可以使用包装器代码。 这样,您可以在本机代码实现之间动态切换。
看这里: JNI中库的动态加载
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.