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

时间:2017-10-03 06:17:19

标签: java java-native-interface

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

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

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

2 个答案:

答案 0 :(得分:1)

没有理由不这样做,但通常只想加载一次本机库。实现这一目标的最简单方法是通过静态初始化程序。否则,您需要实施自己的机制以防止它多次发生。请参阅Is it possible to load different versions of the same DLL in Java?以重新加载库。

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

答案 1 :(得分:1)

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

Java™ Native Interface: Programmer’s Guide and Specification, The

你可以在哪里阅读:

  

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

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

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

看看这里:dynamic loading of library in JNI