现在的位置: 首页 > 综合 > 正文

java.lang.UnsatisfiedLinkError:sayHello()

2013年12月06日 ⁄ 综合 ⁄ 共 2665字 ⁄ 字号 评论关闭

这个问题我查了好几天,终于找到这篇文章,转载一下,希望更多人,从中找到解决方案.

转载地址:http://java.chinaitlab.com/base/838280.html

 运行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。

  ===================================================================================

  最近项目中用到了jni,于是安装了eclipse的cdt和MinGW来用,以前没怎么动过C语言,网上找了下教程,倒是挺容易的,一路弄下来也没提示什么错误,但是在最后调用本地方法时却遇到了大麻烦,总是提示找不到方法。即使一个简单的HelloWorld,也是一样

  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那样添加前缀的下划线

  ========================================================================

  现象: 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的加载。

【上篇】
【下篇】

抱歉!评论已关闭.