2

在 Eclispe RCP 应用程序中,有没有办法检查当前系统上是否有特定的本地库可用?

使用 System.loadLibrary("myLib"); 然后捕获 UnsatisfiedLinkError 会导致其他包无法使用该库,因为这会导致错误“库已由另一个类加载器加载”。

我在互联网上找到了解决这个问题的方法,它使用自定义类加载器,然后加载库,然后使用 System.gc() 对类加载器进行垃圾收集,这也将卸载库以便可以加载它再次被另一个捆绑。

不过也有缺点:

  1. 它需要大量的自定义代码
  2. 捕捉 UnsatfisfiedLinkError 有点吓人
  3. 假设 Bundle1 加载库以检查可用性。然后 Bundle1 卸载该库,而 Bundle2 加载该库以实际使用它。Bundle2 不会卸载库(因为没有理由这样做)。然后,Bundle1 再次要加载库以检查可用性。这又会导致 UnsatisfiedLinkError。
4

1 回答 1

0

ad 3.) 首先,我会避免让捆绑包随机加载系统库。也许您可以将系统库的处理及其所有访问打包到一个服务包中?

我同意,捕捉ERROR不仅可怕,而且可能根本不是我们应该做的事情。错误是一个虚拟机错误,这通常会导致您的虚拟机或您的应用程序重新启动,以确保稳定运行。

对我来说,检查库是否可用类似于检查文件资源是否存在。如果库在您的应用程序上下文中非常动态,您可以让用户浏览库并让应用程序知道它在哪里。如果没有用户这样的东西,你不能简单地在客户端机器的路径中搜索文件吗?

于 2013-09-02T11:37:21.857 回答