运行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接口文件,文件在报表安装目录DogDriver\JavaAPI下可以找到) 并且要注意PATH环境变量中要包含System32目录。(如果服务器操作系统是Linux,那么使用报表安装目录DogDriver\JavaAPI下的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:\winnt\system32\mrchklib.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。
Exception in thread "main" java.lang.UnsatisfiedLinkError: HelloWorld.print()V
奇怪了,loadLibrary()没有问题,怎么会找不到方法呢?用dll export viewer察看,导出的方法为
函数名 地址 偏移量
Java_HelloWorld_print@8 0x67741250 0x00001250
实在没办法了,只好安装庞大的visual studio重新来编译,调用成功了!
再次用dll export viewer查看,发现函数名的前面多了一条下划线
函数名 地址 偏移量
_Java_HelloWorld_print@8 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那样添加前缀的下划线
类装入问题:UnsatisfiedLinkError | ||
在把本机调用链接到对应的本机定义时,类装入器扮演着重要角色。如果程序试图装入一个不存在或者放错的本机库时,在链接阶段的解析过程会发生
对于声明为
当调用本机方法时,类装入器会尝试装入定义了该方法的本机库。如果找不到这个库,就会抛出这个错误。 清单 6 演示了抛出 清单 6. UnsatisfiedLinkError. java
这段代码调用本机方法
本机库的装入由调用
在清单 6 中, |
java.lang.UnsatisfiedLinkError出现这种错误的原因是一般是java虚拟机找不到声明为native方法的本地语言定义时,出现的错误。在我的理解过程中我一般都认为是由于导入dll或者导入lib文件不正确导致的。有些需要静态导入就没有问题(即在前面加static来导入lib文件),如果是不加static导入也就是动态导入的时候,那么需要添加catch的抛出异常来解决,如 try{ 这种方式来判断,或者直接在类前面添加 static{ System.loadLibrary("vtkCommonJava");
}
================================================================================
==================================================================================== 另外,还可能是dll本身的问题,使用release版的,而不要用debug版的 |