`
botan1314
  • 浏览: 24716 次
  • 性别: Icon_minigender_1
  • 来自: 湖南
社区版块
存档分类
最新评论

类装入问题:UnsatisfiedLinkError(转载)

阅读更多

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。


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/niuxinlong/archive/2009/05/13/4176612.aspx

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics