繁体   English   中英

为什么在java中加载JNI是在静态初始化程序中完成的?

[英]why loading JNI in java is done in static initializer?

在使用 JNI 的许多示例中,我看到类似的内容:

class SampleClass {
    static {
        System.loadLibrary("somelib");
    }
    ...
}

这种特殊语法的目的是什么? 为什么要使用它(而不仅仅是在类构造函数或类似的东西中?

没有理由不这样做,但是通常您只想加载本机库一次。 实现这一目标的最简单方法是通过静态初始化程序。 否则,您需要实现自己的机制以防止它多次发生。 请参阅是否可以在 Java 中加载同一 DLL 的不同版本? 用于重新加载库。

另一个原因是您无法使用本机代码提供静态方法。

我想你会从书中得到最好的答案:

Java™ 本机接口:程序员指南和规范,

你可以在哪里阅读:

在调用本机方法print 之前,必须加载实现print 的本机库。 在这种情况下,我们在 HelloWorld 类的静态初始化程序中加载本机库。 Java 虚拟机在调用 HelloWorld 类中的任何方法之前会自动运行静态初始化程序,从而确保在调用打印本机方法之前加载本机库。

通常,没有什么可以阻止您在类的方法中加载库。 方法,那不是static 但在这种情况下,您必须确保在调用任何本机方法之前加载库(通过调用调用 load 或 loadLibrary 的方法)。

此外,如果您想加载另一个版本的库,而无需使用多个 ClassLoader,您始终可以使用包装器代码。 这样,您可以在本机代码实现之间动态切换。

看这里: JNI中库的动态加载

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM