栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

java.lang.UnsatisfiedLinkError:本机库XXX.so已加载到另一个类加载器中

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

java.lang.UnsatisfiedLinkError:本机库XXX.so已加载到另一个类加载器中

问题在于OpenCV如何处理本机库的初始化。

通常,使用本机库的类将具有加载该库的静态初始化程序。这样,类和本机库将始终在同一类加载器中加载。使用OpenCV,应用程序代码将加载本机库。

现在有一个限制,即本机库只能在一个类加载器中加载。Web应用程序使用它们自己的类加载器,因此,如果一个Web应用程序已加载本机库,则另一个Web应用程序将无法执行相同的操作。因此,无法将加载代码的本机库放置在webapp目录中,而必须放置在容器的(Tomcat)共享目录中。当您使用上面的常用模式编写了一个类时(

loadLibrary
在使用类的静态初始化程序中),将包含该类的jar放在共享目录中就足够了。
loadLibrary
但是,使用OpenCV和Web应用程序代码中的调用,本机库仍将加载到“错误的”类加载器中,并且您将获得
UnsatisfiedlinkError

要使“正确的”类加载器加载本机库,您可以使用仅执行的单个静态方法创建一个微型类

loadLibrary
。将此类放在一个额外的jar中,然后将此jar放在共享的Tomcat目录中。然后,在Web应用程序中,将对的调用替换
System.loadLibrary
为对新的静态方法的调用。这样,OpenCV类的类加载器及其本机库将匹配,并且可以初始化本机方法。

编辑:评论员要求的示例

代替

public class WebApplicationClass {    static {        System.loadLibrary(org.opencv.core.Core.NATIVE_LIBRARY_NAME);    }}

采用

public class ToolClassInSeparateJarInSharedDirectory {    public static void loadNativeLibrary() {        System.loadLibrary(org.opencv.core.Core.NATIVE_LIBRARY_NAME);    }}public class WebApplicationClass {    static {        ToolClassInSeparateJarInSharedDirectory.loadNativeLibrary();    }}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/368329.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号