java - 在浏览器中的 Applet 中重新加载 DLL

标签 java dll applet java-native-interface

我有一个关于为什么会出现以下问题的理论,但我找不到任何文档以某种方式证明我的理论,所以我需要一些建议。

我有一个(签名的)小程序,它加载一个 DLL。现在,上周五我点击了“刷新”,小程序重新加载正常,包括显然重新加载 DLL。但是今天,点击“刷新”会导致以下异常:

java.lang.UnsatisfiedLinkError: Native Library XXX already loaded in another classloader

根据 Javadoc (Java 6) System.loadLibrary 是 Runtime.loadLibrary 的便捷方法,根据该文档:

If this method is called more than once with the same library name, the second and subsequent calls are ignored.

我知道并理解您不能在同一个 JVM 中的不同类加载器中加载同一个 native 库,这解释了上述异常。我想证明的是为什么它似乎在某一天起作用,但现在却不起作用。特别是考虑到 DLL 加载周围没有任何代码更改。

所以我的假设是这样的;

  1. 上面的文档应该写成“忽略同一个类加载器中的第二次和后续调用”
  2. 上周五,行星的排列方式不同,因此当我点击刷新时,浏览器使用了不同的 JVM(或者可能是同一个类加载器?),因此 DLL 已正确加载并且运行良好。<
  3. 今天行星的排列方式不同,浏览器重用相同的 JVM 但使用不同的类加载器,这解释了为什么我现在收到此错误。

顺便说一句,有问题的浏览器是 IE7,我运行的是 Java 1.6。我不认为浏览器版本特别重要,因为据我所知,浏览器决定如何处理 applet 完全取决于浏览器实现者。

这些假设是否合理且正确?我可能错过了什么?

非常感谢。

最佳答案

听起来像这样Problem : Native Library already loaded in another classloader

现在他们谈论的是 servlet,而不是 applet,但许多相同的行为都适用。

浏览器将类加载器绑定(bind)到 url 和可能的套接字连接。因此,重新加载将重用相同的类加载器,除非浏览器等待足够长的时间以闲置连接,此时您将获得一个新的套接字,从而获得一个新的类加载器。我们在同一个页面上有多个小程序,在重新加载页面后他们是否会共享一个类加载器是一个废话。

关于java - 在浏览器中的 Applet 中重新加载 DLL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4088487/

相关文章:

c++ - 依赖于其他 DLL 的插件 DLL

c# - 反汇编签名的dll

windows - PE header 和 LARGEADDRESSAWARE 未针对 DLL 模块进行评估?

flash - 使用麦克风与网页互动

java - 如何绕过父类paint方法的调用

java - 在 Mac OS x 10.4 上加载小程序的问题

javascript - 1941/1942 年 javascript 日期 api 的奇怪行为

java - 编辑 JTable 时行为不一致

java - 安卓 : Problems with accents and ñ

java - 向现有正则表达式添加几个特殊字符