java.lang.UnsatisfiedLinkError解决方法汇集.doc_第1页
java.lang.UnsatisfiedLinkError解决方法汇集.doc_第2页
java.lang.UnsatisfiedLinkError解决方法汇集.doc_第3页
java.lang.UnsatisfiedLinkError解决方法汇集.doc_第4页
java.lang.UnsatisfiedLinkError解决方法汇集.doc_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

J2EE引擎出现java.lang.UnsatisfiedLinkError: CC错误的原因 运行JSP报表程序页面出现java.lang.UnsatisfiedLinkError: CC错误有以下几种原因和处理方法:1、请查看控制台的错误信息a:如果控制台的消息是类似java.lang.UnsatisfiedLinkError: no MRChkLib in java.library.path,Error loading library MRChkLib这样的错误信息,那么是因为MRChkLib.dll没有拷贝到windows的System32目录下. (MRChkLib.dll是加密锁的JAVA接口文件,文件在报表安装目录DogDriverJavaAPI下可以找到) 并且要注意PATH环境变量中要包含System32目录。(如果服务器操作系统是Linux,那么使用报表安装目录DogDriverJavaAPI 下的libMRChkLib.so文件,将libMRChkLib.so复制到WebServer的启动bin目录。如果在这个目录下仍然出现can not load library错误,请设置系统环境变量LD_LIBRARY_PATH的值为libMRChkLib.so所在的目录。例如:如果libMRChkLib.so在/somedir目录下,则 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/somedir)b:如果控制台的消息是类似java.lang.unsatisfiedLinkError :native libery c:winntsystem32mrchklib.dll already loaded in another classLoader error loading mrchklib.dll这样的错误信息,那么是因为WebAPP在重新被启动之后,无法再次加载动态库造成的,这是java的约束,Java不允许一个实例加载多次动态库.可以这样解决,将mr.jar拷贝到WebServer的lib目录,删除/WEB-INF/lib目录下的mr.jar,然后重新启动 webserver。2、如果一个webserver上有多个报表应用,请将/WEB-INF/lib/mr.jar移动到WebServer的lib目录下,确保每一个Web应用程序目录下都没有mr.jar,而只有WebServer的lib目录下有该文件,重启webserver.3、一个Webserver上只能有一个mr.jar文件,删掉多余的mr*.jar文件,然后清除webserver临时文件,重新启动webserver。=最近项目中用到了jni,于是安装了eclipse的cdt和MinGW来用,以前没怎么动过C语言,网上找了下教程,倒是挺容易的,一路弄下来也没提示什么错误,但是在最后调用本地方法时却遇到了大麻烦,总是提示找不到方法。即使一个简单的HelloWorld,也是一样 Exception in thread main java.lang.UnsatisfiedLinkError: HelloWorld.print()V 奇怪了,loadLibrary()没有问题,怎么会找不到方法呢?用dll export viewer察看,导出的方法为 函数名 地址 偏移量 Java_HelloWorld_print8 0x67741250 0x00001250 实在没办法了,只好安装庞大的visual studio重新来编译,调用成功了! 再次用dll export viewer查看,发现函数名的前面多了一条下划线 函数名 地址 偏移量 _Java_HelloWorld_print8 0x67741250 0x00001250 看来是给MinGW少传了某个参数,经过网上查阅资料,终于找到一个解决方案:给MinGW的ld命令指定一个参数-kill-at即可 gcc -Wl, -kill-at -shared -o jnihello.dll HelloWorld.c 再次用dll export viewer查看,发现导出的函数名称变为 函数名 地址 偏移量 Java_HelloWorld_print 0x67741250 0x00001250 -kill-at指令去掉了函数名称后缀的,并没有像msvc那样添加前缀的下划线 =现象: java.lang.UnsatisfiedLinkError: Native Library xxx.dll already loaded in another classloader at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1551) at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1511) at java.lang.Runtime.loadLibrary0(Runtime.java:788) at java.lang.System.loadLibrary(System.java:834) 分析:这种错误在我们使用热启动方式发布某个使用了JNI技术的Web应用时,并将调用年native方法的jar包独立部署在该应用下面,当我们的Web应用有了更新以后,在调用到该jar包封装的native方法时,会抛出该错误。(以上OS为Windows,若是Linux或Unix,应该是xxx.so 报错) 这是因为Web服务器已经在第一次加载该应用时,已经load了该dll,当该应用被再次热启动时,该dll将重新被加载,于是报错。解决方案: 一、将含有JNI调用的jar包部署在Web服务器的公用lib库中。Web应用再发布时可以不用加载;二、jar包部署不变,在该Web中实现一个listener,监听是否第一次启动,若不是第一次启动,屏蔽掉该jar包所含dll的加载。 =类装入问题:UnsatisfiedLinkError 作者:Simon Burns 来源:IBM 整理日期:2007-6-3 UnsatisfiedLinkError在把本机调用链接到对应的本机定义时,类装入器扮演着重要角色。如果程序试图装入一个不存在或者放错的本机库时,在链接阶段的解析过程会发生 UnsatisfiedLinkError。JVM 规范指定 UnsatisfiedLinkError 是:对于声明为 native 的方法,如果 Java 虚拟机找不到和它对应的本机语言定义,就会抛出该异常。 当调用本机方法时,类装入器会尝试装入定义了该方法的本机库。如果找不到这个库,就会抛出这个错误。清单 6 演示了抛出 UnsatisfiedLinkError 的测试用例 :清单 6. UnsatisfiedLinkError.java public class UnsatisfiedLinkErrorTest public native void call_A_Native_Method(); static System.loadLibrary(myNativeLibrary); public static void main(String args) new UnsatisfiedLinkErrorTest().call_A_Native_Method(); 这段代码调用本机方法 call_A_Native_Method(),该方法是在本机库 myNativeLibrary 中定义的。因为这个库不存在,所以在程序运行时会发生以下错误:The java class could not be loaded. java.lang.UnsatisfiedLinkError: Cant find library myNativeLibrary (myNativeLibrary.dll) in sun.boot.library.path or java.library.path sun.boot.library.path=D:sdkjrebin java.library.path= D:sdkjrebin at java.lang.ClassLoader$NativeLibrary.load(Native Method) at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:2147) at java.lang.ClassLoader.loadLibrary(ClassLoader.java:2006) at java.lang.Runtime.loadLibrary0(Runtime.java:824) at java.lang.System.loadLibrary(System.java:908) at UnsatisfiedLinkErrorTest.(UnsatisfiedLinkErrorTest.java:6) 本机库的装入由调用 System.loadLibrary() 方法的类的类装入器启动 在清单 6 中,就是 UnsatisfiedLinkErrorTest 的类装入器。根据使用的类装入器,会搜索不同的位置:对于由 bootstrap 类装入器装入的类,搜索 sun.boot.library.path。 对于由扩展类装入器装入的类,先搜索 java.ext.dirs,然后是 sun.boot.library.path,然后是 java.library.path。 对于由系统类装入器装入的类,搜索 sun.boot.library.path,然后是 java.library.path。 在清单 6 中,UnsatisfiedLinkErrorTest 类是由系统类装入器装入的。要装入所引用的本机库,这个类装入器先查找 sun.boot.library.path,然后查找 java.library.path。因为在两个位置中都没有需要的库,所以类装入器抛出 UnsatisfiedLinkageError。=java.lang.UnsatisfiedLinkError 出现这种错误的原因是一般是java虚拟机找不到声明为native方法的本地语言定义时,出现的错误。在我的理解过程中我一般都认为是由于导入dll或者导入lib文件不正确导致的。有些需要静态导入就没有问题(即在前面加static来导入lib文件),如果是不加static导入也就是动态导入的时候,那么需要添加catch的抛出异常来解决,如try System.loadLibrary(vtkCommonJava); System.loadLibrary(vtkFilteringJava); System.loadLibrary(vtkIOJava); System.loadLibrary(vtkImagingJava); System.loadLibrary(vtkGraphicsJava); System.loadLibrary(vtkRenderingJava); catch(Throwable e) System.out.println(The load problem); 这种方式来判断,或者直接在类前面添加static System.loadLibrary(vtkCommonJava); System.loadLibrary(vtkFilteringJava); System.loadLibrary(vtkIOJava); System.loadLibrary(vtkImagingJava); System.loadLibrary(vtkGraphicsJava); System.loadLibrary(vtkRenderingJava);=关于java.lang.UnsatisfiedLinkError(JNI) 目标:把pbp1.0的java包和native移到GEM中,并使GEM在新的虚拟机上正常运行 背景:GEM(1)有一堆java包和native函数,pbp1.0是虚拟机和JAVA基本包,要将pbp1.0的虚拟机移走只用它的JAVA基本包和native函数。 问题:在将GEM和pbp1.0的native函数生成一个动态库后在程序里System.loadLibrary()无法加载,报java.lang.UnsatisfiedLinkError 解决过程: 1,理论 我们知道,JAVA调用native函数时,必须通过System.loadLibrary()或System.load将其native函数所在动态库加载到虚拟机。并在运行时指明-Djava.library.path或-Dsun.boot.library.path,将其指向包含有native函数的动态库所在位置。 2,实施 我按这个步骤操作完成后就是无法加载我生成的动态库libgem.so,这个库用到的其他动态库包括:rt,pthread,freetype,dl, directfb,而directfb用到的动态库有rt,dl,pthread,freetype,jpeg,png,这些库除了directfb要生成外其余都在/lib目录下存在。 3,思路 先写了一个Hello的测试用例。发现在native里所使用到其他动态库时,无论是否存在于相关目录,仍然无法加载。然后经过修改编译选项,把所使用到的动态库连动态连接进目标库,如下: $(GCC) -fPIC -shared -o libdirectfb.so . -lpng -ljpeg -lpthread -lrt -ldl, -lfreetype 经过这么一个修改后,directfb可以加载。 这也说明System.loadLibrary()所加载的动态库所引用的所有符号都要能找到。如果有一个无法找到将无法加载。可以写一个空的main ()函数,对你的动态库进行连接,如果动态库里所引用的符号在指定的动态库和本身找到不到则无法编译通过,那么这个动态库也肯定加载不了。 4,问题解决 按照这个思路,对libgem.so的编译Makefile做相应修改后,问题解决!并在LD_LIBRARY_PATH加入动态库所在目录。(1) MHP (Multimedia Home Platform) was developed by the DVB Project as the worlds first open standard for interactive television. It is a Java-based environment which defines a generic interface between interactive digital applications and the terminals on which those appli

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论