我正在尝试用Java卸载dll。我已经阅读了thisthis,但似乎您不能保证该dll确实会在特定时间卸载。这是因为System.gc()只是“善待”以使垃圾收集器运行。

因此,这里是情况的分解。我有一个通过JNI提供某些功能的dll。让我们称这个dll为MainDll。 MainDll是从对System.load(“MainDll”)的调用中加载的。我需要能够即时卸载和加载该dll。

是否有可能创建另一个DLL,其唯一目的是加载和卸载MainDll。让我们称之为DLL LoaderDll。然后,我可以简单地调用System.load(“LoaderDll”)并具有一些本机函数来加载和卸载MainDll。这样做的原因是,我可以访问本机系统上可以动态加载和卸载dll的功能。棘手的是,如果它是从LoaderDll内部加载的,我仍然可以访问在MainDll中编写的本机函数。

抱歉,这是一个令人困惑的问题。似乎有点难以解释。

谢谢

最佳答案

创建一个执行加载/卸载的包装DLL。 DLL中还具有包装器方法,该包装器方法可以将调用转交给已加载的MainDll DLL。这样,您的Java JNI代码仅知道单个DLL。它仍然可以请求卸载[LoaderDll::unload()],从内部卸载MainDll。

只要在当前未加载MainDll的情况下调用LoaderDll中的方法/函数可以触发MainDll的加载,这就应该起作用,假定这是所需的行为,而不是引发异常/错误。

一个问题是,总是会加载LoaderDll。

08-28 22:32