【发布时间】:2009-07-16 18:22:53
【问题描述】:
在我正在编写的 Java 程序中,我对 dll 进行 jni 调用并在启动时加载库,如下所示
static
{
System.loadLibrary("LdapAuthenticator2");
}
然后我实现了另一个加载同一个库的类,并收到一个错误说该库已加载,有什么方法可以检查该库是否已经在运行?
谢谢,
-皮特
【问题讨论】:
标签: java java-native-interface
在我正在编写的 Java 程序中,我对 dll 进行 jni 调用并在启动时加载库,如下所示
static
{
System.loadLibrary("LdapAuthenticator2");
}
然后我实现了另一个加载同一个库的类,并收到一个错误说该库已加载,有什么方法可以检查该库是否已经在运行?
谢谢,
-皮特
【问题讨论】:
标签: java java-native-interface
查看我对这个问题的回答
How do I get a list of JNI libraries which are loaded?
该解决方案有效,不幸的是,问题的发布者似乎存在与非 SUN 兼容的 JVM 或过于严格的 SecurityManager 的问题。
示例 POC 源代码的链接。
【讨论】:
什么样的错误?如果是异常,你能抓住它吗?
另一种方法是让一个类负责加载库。您可以将加载库作为类的静态初始化程序的一部分,然后加载 class== 加载库。
编辑:javadocs for Runtime.loadLibrary()(System.loadLibrary 调用)甚至建议使用静态初始化方法:
如果要在类的实现中使用本地方法,则 标准策略是把原生 库文件中的代码(调用它 LibFile) 然后放一个静态的 初始化器:
static { System.loadLibrary("LibFile"); }在类声明中。当类被加载和初始化时, 必要的本机代码 本机方法的实现 然后也会被加载。
javadocs 还说:
如果使用相同的库名多次调用此方法,则忽略第二次和后续调用。
这让我对你遇到的错误更加好奇。
【讨论】: