在许多使用JNI的例子中,我看到类似的内容:
class SampleClass {
static {
System.loadLibrary("somelib");
}
...
}
这种特殊语法的目的是什么?为什么要使用它(而不只是在类构造函数中或类似的东西?
答案 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,则始终可以使用包装器代码。这样,您就可以在本机代码实现之间动态切换。