http://www.cnblogs.com/newstar/archive/2012/03/14/2396176.html
笔者在前段时间碰到这么一种情况,即在两个项目中使用了相同的applet,然后在applet中调用了dll操作(使用jni或jna),然后在客户端进行调用。实际的访问过程如下:
首先访问项目A的一个界面,界面中调用了appletA,接着并没有关闭浏览器而直接访问项目B的界面,在界面中调用了appletB。appletA和appletB实际上是同一个applet,只不过这个applet使用在了两个项目中,并且两个项目均是直接进行访问。这时候在访问appletB的时候,就会出现一个错误:
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,就没有问题了。
分享到:
相关推荐
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...
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中的...
最近我们发现很多用户...java.lang.UnsatisfiedLinkError: couldn't find libarcsoft_face_engine.so 原因: 在安装应用时,APK中指定的ABI目录下没有发现指定的动态库,寻找apk中动态库的规则详见 https://developer
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中的`java.lang.UnsatisfiedLinkError`是一个常见的运行时异常,通常出现在Java试图加载本地(C或C++)库时找不到相应的函数或者方法。在Android开发中,尤其是在使用JNI(Java Native Interface)进行跨语言...
解决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...
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目录下,解决此问题