如何在不需要完全重新启动浏览器的情况下替换Java小程序中加载的动态库?

如何在不需要完全重新启动浏览器的情况下替换Java小程序中加载的动态库?,java,java-native-interface,shared-libraries,Java,Java Native Interface,Shared Libraries,我正在写一个自我更新的应用程序。第一次运行时,它会在客户端的计算机上安装一个本机库,这样他们就不必每次都下载它。当它检测到已安装库的版本早于新的最低要求时,它将下载并安装新的版本 问题是,在用户关闭并重新启动浏览器(不是选项卡,而是整个浏览器)之前,Java实际上没有使用新的库。这是我试图避免的——不过,如果用户需要刷新页面,或者关闭页面,然后再次打开页面,也可以 每次小程序启动时,我都尝试将已安装的库复制到临时文件夹中,然后总是加载该副本,但没有效果。这里有人这样做过吗?有什么好主意吗?操作系

我正在写一个自我更新的应用程序。第一次运行时,它会在客户端的计算机上安装一个本机库,这样他们就不必每次都下载它。当它检测到已安装库的版本早于新的最低要求时,它将下载并安装新的版本

问题是,在用户关闭并重新启动浏览器(不是选项卡,而是整个浏览器)之前,Java实际上没有使用新的库。这是我试图避免的——不过,如果用户需要刷新页面,或者关闭页面,然后再次打开页面,也可以

每次小程序启动时,我都尝试将已安装的库复制到临时文件夹中,然后总是加载该副本,但没有效果。这里有人这样做过吗?有什么好主意吗?操作系统是Linux、JDK1.5和Firefox


谢谢

Java类只能通过卸载拥有它们的类加载器来卸载。由于JNI库依赖于拥有该库的类,因此可能需要卸载拥有该库的类的类加载器


尝试为与JNI库接口的类实例化一个实例,并使用反射创建有问题的类的实例。当您想要卸载它时,从更新的JAR中创建一个新的类加载器,它引用库的新版本(使用不同的库文件名,这样您可以同时加载两个版本,直到GC处理旧版本)

Java类只能通过卸载拥有它们的类加载器来卸载。由于JNI库依赖于拥有该库的类,因此可能需要卸载拥有该库的类的类加载器


尝试为与JNI库接口的类实例化一个实例,并使用反射创建有问题的类的实例。当您想要卸载它时,从更新的JAR中创建一个新的类加载器,它引用库的新版本(使用不同的库文件名以便可以同时加载两个版本,直到GC处理旧版本)

这正是此错误报告中描述的情况: (报告说它适用于Windows,但实际上这是一个Java问题)

在VM终止之前,Java代码无法卸载本机dll。一旦加载了dll,它将在JVM的生命周期中一直存在,VM将确保加载它一次,并且只加载一次


我所能看到的使您的场景工作的唯一方法是,如果您能够在加载dll之前以某种方式执行版本检查和更新。一旦它被使用,你就会被它卡住。

这正是本错误报告中描述的情况: (报告说它适用于Windows,但实际上这是一个Java问题)

在VM终止之前,Java代码无法卸载本机dll。一旦加载了dll,它将在JVM的生命周期中一直存在,VM将确保加载它一次,并且只加载一次

我所能看到的使您的场景工作的唯一方法是,如果您能够在加载dll之前以某种方式执行版本检查和更新。一旦它被使用,你就会被它困住