问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

关于Java的报错

发布网友 发布时间:2022-04-22 08:20

我来回答

2个回答

热心网友 时间:2022-06-02 12:16

展开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:/sdk/jre/bin
                       java.library.path= D:/sdk/jre/bin
                       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.<clinit>(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 world's 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 applications execute. MHP was designed to run on DVB platforms but there was a demand to extend the interoperability it offers to other digital television platforms. This demand gave rise to GEM, or Globally Executable MHP, a framework which allows other organisations to define specifications based on MHP.

   

   

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

另外,还可能是dll本身的问题,使用release版的,而不要用debug版的

   

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

关于编写JNI时的发生的unsatisfiedlinkError错误- -

 

 

这个错误也让我郁闷了半天,现在我把它写出来,可以让大家少走点弯路。一般这个错误有两种:

1。unsatisfiedlinkError:dll名,那说明你没有把dll放到合适的位置,一般就和要调用原生函数的类放在一起,当然前提是你成功的生成dll了

2。unsatisfiedlinkError:方法名,这个时 候你其实dll已经成功生成了,而且位置也正确,它的意思就是你没有定义那个函数,你可能会说,我明明定义了,其实当你发现问题所在,你只能自虐了,肯定 是你在C文件中定义函数时有些字母大小写错了,因为其他地方是自动生成的,不会出错。尤其是直接从网上拷贝源程序时经常发生这种问题,有些作者不负责任, 把有错误的程序也贴上去。

 

转自:http://www.360doc.com/content/090402/09/107226_2994393.html


热心网友 时间:2022-06-02 12:16

可能是引入的类跟调用的不匹配。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
显卡降价矿难了!分享几个检测矿卡的实用软件 怎么分辨二手显卡刷bios 下文教你 怎么识别矿卡 鉴别矿卡的方法介绍 怎么设置小度在家回家视频通话? 贵阳砂岩雕塑厂有哪些 西安市长安二中附近有老年公寓没 来西安这么久了第一次租到性价比高的房子,松鼠公寓良心推荐_西安... 陕西省自强中等专业学校2024年学费多少 宝鸡市区有什么比较好的楼盘 乔安如何远程监控 no jcom in java.library.path是什么问题 中信银行卡账号是16位数字 说明什么 java的-D选项作用 System.out.println(System.getProperty(&quot;java.lib... eclipse配置jogl环境 ,no jogl in java.library.path System.getProperty(&quot;java.library.path&quot;)获取java... 大红袍 凤凰单枞 区别 linux中JNI的no HelloWorld in java library path... 大红袍茶有什么特点?听说一个叫茶了么商城里有? Java异常:no w3jfwx_jni in java.library.path 如何解决no jzmq in java.library.path 武夷山大红袍的外形特征 在WebSphere中怎么在Java Library path中添加目录... JAVA开发遇到not found on the java.library.path... 如何解决java.library.path属性在代码中设置不生效... 大红袍茶树的品质特征 java no XXX in java.library.path怎么配置 java.library.path在什么地方? 大红袍的品质特征有哪些? 如何找java.library.path eclipse 安装报错 no svnjavahl-1 in java.library... 求爱吃草莓的文 中信银行信用卡卡号几位数的 为何韩雪过个生日,众多网友都纷纷说是在“炫富”? 求 爱吃草莓的文集 求建设工程施工合同(示范文本) 我最爱吃草莓作文250字 零星工程施工合同范本一最新版 名字带“雪”字的女明星,张雪迎、韩雪个个貌美如花... 零星工程施工合同最新版 求作者爱吃草莓文集 韩雪 可爱吗? 我喜欢吃草莓的作文,200字 《声临其境》韩雪哪一期? 求龙马爱吃草莓的文集txt百度云 求海棠作者:爱吃草莓的文 求爱吃草莓的小说。 求爱吃草莓的小说,有艳星和雪国圣子的 言情小说女主角很喜欢吃草莓的,求书名 韩雪你们喜欢吗