- 浏览: 23523 次
- 性别:
- 来自: 深圳
最新评论
笔者在前段时间碰到这么一种情况,即在两个项目中使用了相同的applet,然后在applet中调用了dll操作(使用jni或jna),然后在客户端进行调用。实际的访问过程如下:
首先访问项目A的一个界面,界面中调用了appletA,接着并没有关闭浏览器而直接访问项目B的界面,在界面中调用了appletB。
appletA和appletB实际上是同一个applet,只不过这个applet使用在了两个项目中,并且两个项目均是直接进行访问。这时候在访问appletB的时候,就会出现一个错误:
1
xxx NOT loaded java.lang.UnsatisfiedLinkError : Native Library XXX.dll already loaded in another classloader
如果访问从appletB到appletA,那么在访问appletA时也会出现同样的错误。
因为,在一个标签页中,多个applet运行实际上是运行在同一个jvm上,只是加载applet时使用了不同的classLoader。因此,不管是appletA先运行还是appletB先运行,最终情况都是所依赖的dll都会被同一个jvm所加载,就会出现以上的错误了。
在进行google之后,发现很多开发人员都碰到了同样的问题,有的是因为在同一个javaEE容器如(weblogic,jboss)中部署了两个都要访问同一个jni调用的项目,有的则是像笔者同样的经历。最后的结论即是,在一个jvm当中,是不允许加载一个dll两次的。因此,后面的jni调用时,尝试再次加载同一个dll,这时候即会报上面的错误了。因为该错误,相对应的java类肯定不能被初始化,因此相应的项目或者applet肯定启动不了了。
解决这个问题其实很简单,将访问到jni的代码单独提取出来,并不直接让项目自身的classLoader加载,则是让其由systemLoader加载即可。一种方法就是将这部分代码,单独封装成一个jar,放到java的systemLoader可以加载的地方,如lib/ext目录下。然后,项目中仍然去调用此代码。由于访问dll的代码由systemLoader加载,因此,多个项目同时访问同一个dll时,即可避免再次加载了。因为,第二个项目在访问时,寻找到的类,已经被systemLoader加载过了,因此项目本身的classLoader就不会再去加载这个类了。
对比,原来的appletA,appletB,修改过后就成了这样的结构:appletA,appletB,以及jniAccess.jar,其中jniAccess.jar放到jre的lib目录的ext目录下。这样,再次访问applet,就没有问题了。
转载请标明出处:i flym
本文地址:http://www.iflym.com/index.php/code/resolve-java-lang-unsatisfiedlinkerror-native-library-dll-already-loaded-in-another-classloader-problem.html
首先访问项目A的一个界面,界面中调用了appletA,接着并没有关闭浏览器而直接访问项目B的界面,在界面中调用了appletB。
appletA和appletB实际上是同一个applet,只不过这个applet使用在了两个项目中,并且两个项目均是直接进行访问。这时候在访问appletB的时候,就会出现一个错误:
1
xxx NOT loaded java.lang.UnsatisfiedLinkError : Native Library XXX.dll already loaded in another classloader
如果访问从appletB到appletA,那么在访问appletA时也会出现同样的错误。
因为,在一个标签页中,多个applet运行实际上是运行在同一个jvm上,只是加载applet时使用了不同的classLoader。因此,不管是appletA先运行还是appletB先运行,最终情况都是所依赖的dll都会被同一个jvm所加载,就会出现以上的错误了。
在进行google之后,发现很多开发人员都碰到了同样的问题,有的是因为在同一个javaEE容器如(weblogic,jboss)中部署了两个都要访问同一个jni调用的项目,有的则是像笔者同样的经历。最后的结论即是,在一个jvm当中,是不允许加载一个dll两次的。因此,后面的jni调用时,尝试再次加载同一个dll,这时候即会报上面的错误了。因为该错误,相对应的java类肯定不能被初始化,因此相应的项目或者applet肯定启动不了了。
解决这个问题其实很简单,将访问到jni的代码单独提取出来,并不直接让项目自身的classLoader加载,则是让其由systemLoader加载即可。一种方法就是将这部分代码,单独封装成一个jar,放到java的systemLoader可以加载的地方,如lib/ext目录下。然后,项目中仍然去调用此代码。由于访问dll的代码由systemLoader加载,因此,多个项目同时访问同一个dll时,即可避免再次加载了。因为,第二个项目在访问时,寻找到的类,已经被systemLoader加载过了,因此项目本身的classLoader就不会再去加载这个类了。
对比,原来的appletA,appletB,修改过后就成了这样的结构:appletA,appletB,以及jniAccess.jar,其中jniAccess.jar放到jre的lib目录的ext目录下。这样,再次访问applet,就没有问题了。
转载请标明出处:i flym
本文地址:http://www.iflym.com/index.php/code/resolve-java-lang-unsatisfiedlinkerror-native-library-dll-already-loaded-in-another-classloader-problem.html
发表评论
-
启动Tomcat启动不了,报以下错:Error listenerStart解决方法
2016-09-04 15:35 498启动Tomcat启动不了,报以下错: org.apach ... -
java自定义标签库的开发
2016-04-08 17:45 0java自定义标签库的开发 :http://www.360 ... -
sitemesh技术的应用
2016-03-23 13:55 490sitemesh技术的应用 ... -
java爬虫gecco监控来了,不再裸奔
2016-03-21 15:05 0java爬虫gecco监控来了,不再裸奔 爬虫为什么要监控 ... -
Eclipse快捷键 10个最有用的快捷键
2016-03-12 16:28 0Eclipse中10个最有用的快捷键组合 一个Eclip ... -
JAVA 注解的几大作用及使用方法详解
2016-01-13 15:26 0JAVA 注解的几大作用及使用方法详解(2013- ... -
java内存溢出分析
2016-01-12 18:03 412用jmap生产dump文件,win通过任务管理器查看to ... -
java垃圾回收
2016-01-12 13:42 469 -
java内存泄露
2016-01-12 10:19 0用Eclipse Memory Analyzer查找内存泄露: ... -
计算机网络
2016-01-11 17:12 0计算机网络体系结构:http://henu-zyy.iteye ... -
spring MVC
2016-01-11 15:59 0国际化、本地化及Spring MVC 的设计:http://c ... -
服务器缓存技术
2016-01-11 11:45 0缓存使用与设计系列文章--目录:http://carlosfu ... -
java JFrame关闭窗口最大化功能
2015-06-18 10:05 2083如是JFrame框架,直接设置: JFrame jf = ne ... -
一些JAVA代码功能的相关链接
2015-06-18 09:04 0spring集成quartz任务调度: http://aton ... -
jsp页面静态化例子
2015-06-17 11:20 728连接:http://konglx.iteye.com/blog ... -
JFrame实现窗体在屏幕边缘靠边隐藏
2015-06-16 14:30 1120用JAVA swing做一个项目,类似QQ实现靠边隐藏的代码记 ... -
如何在JAVA程序中注册热键
2015-06-08 17:37 634http://walsece.iteye.com/blog/1 ... -
DB2锁表信息
2015-06-01 18:24 489查看数据库锁表信息 ----查询数据库锁表信息 db2 &qu ... -
转:apache安装后no service install解决办法
2015-05-31 17:01 545以下是解决步骤: 1、找到 apache2 目录下的 ... -
在 WebSphere JDBC Adapter 中如何避免死锁和锁超时
2015-05-30 15:40 632在 WebSphere JDBC Adapter 中 ...
相关推荐
Java中的`java.lang.UnsatisfiedLinkError`是一个常见的运行时异常,通常出现在Java试图加载本地(C或C++)库但找不到相应的库文件时。这个错误可能是由于多种原因引起的,如库路径设置不正确、库文件不存在或者版本...
解决方法 后面我把原先tomcat启动环境用的jdk1.7改为了本机安装的jdk1.8就不在报错。 具体过程: 在myeclipse中点击window→preference→在搜索框中输入Tomcat→选择安装的tomcat版本,我这里是选择Tomcat 7.x→点击...
解决方案:Exceptionin thread "main" java.lang.UnsatisfiedLinkError:org.apache.hadoop.util.NativeCrc32.nativeCo
本文件夹专为以下错误对症下药。...Exception in thread "VFW Request Thread" java.lang.UnsatisfiedLinkError: JMFSecurityManager: java.lang.UnsatisfiedLinkError: no jmvfw in java.library.path
本文将详细介绍Java.lang.UnsatisfiedLinkError的解决方法,主要涉及到Java Native Access(JNA)调用DLL库时可能出现的错误。 一、Java.lang.UnsatisfiedLinkError的定义 Java.lang.UnsatisfiedLinkError是Java...
最近我们发现很多用户...java.lang.UnsatisfiedLinkError: couldn't find libarcsoft_face_engine.so 原因: 在安装应用时,APK中指定的ABI目录下没有发现指定的动态库,寻找apk中动态库的规则详见 https://developer
loadLibrary msc error:java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file “/data/app/com.example.xflinean-1/base.apk”],nativeLibraryDirectories=[/vendor/lib, /system/...
Exception in thread “main” java. lang . UnsatisfiedLinkError: org. apache . hadoop. io. nativeio. NativeIOSWindows . access0 (Ijava/ lang/String;I)Z 原因:在调用NativeIO中的...
UnsatisfiedLinkError exception loading native library: njni10 java.lang.UnsatisfiedLinkError: jniGetOracleHome
1.错误Can't load IA 32-bit .dll on a AMD 64-bit platform解决方案 2.springboot启动报错java.lang.UnsatisfiedLinkError: no tcnative-1 in java.library.path 3.tomcat-native-1.2.24-openssl-1.1.1g-win32-bin
解决java引入sigar运行时报错"java.lang.UnsatisfiedLinkError: org.hyperic.sigar.Mem.gather",将压缩包解压后,放入本地项目lib中即可解决该类问题,该jar包由官网下载
安装jpcap报错:Exception in thread "main" java.lang.UnsatisfiedLinkError: C:/Windows/System32/Jpcap.dll: Can't find dependent libraries 解决办法。
java.lang.UnsatisfiedLinkError: no ocijdbc10 in java.library.path java.library.path 部署 ocijdbc10 Myeclipse 8.5中,web项目部署到resin上运行时,报错:java.lang.UnsatisfiedLinkError: no ocijdbc10...
Java中的`java.lang.UnsatisfiedLinkError`是一个常见的运行时异常,通常出现在Java试图加载本地(C或C++)库时找不到相应的函数或者方法。在Android开发中,尤其是在使用JNI(Java Native Interface)进行跨语言...
Window系统无法调用OpenCV代码报错:java.lang.UnsatisfiedLinkError: Directory separator should not appear in library name: C:\Windows\System32\opencv_java343.dll。出现该问题主要是安装的Windows系统缺乏...
消息:线程“ main”中的异常java.lang.UnsatisfiedLinkError:java.library.path中没有win32com.dll十分清楚。 加载程序无法在任何地方找到dll。
AndroidRuntime: java.lang.UnsatisfiedLinkError: Couldn’t load airtalkee from loader dalvik.system.PathClassLoader[DexPathList[[zip file “/system/app/POCM3A.apk”, zip file “/data/data/com.cmccpo
1.SQL Server使用windows用户连接数据库报错...Caused by: java.lang.UnsatisfiedLinkError: no sqljdbc_auth in java.library.path 2.因为缺少sqljdbc_auth.dll 文件 3.下载此资源放到jdk安装路径bin目录下,解决此问题