最近在学习java源码,看到很多java类在调用底层资源方法都终结在了native方法上,我突然明白了jvm之所以能跨平台是因为jvm.dll提供了native方法的实现,在其他操作系统上相应的jvm文件提供了native方法的实现,所以使用jvm.dll中定义的native函数并不会破坏平台无关性,我便将java src中的native移植到我自己的代码中   private native StackTraceElement getStackTraceElement(int index);
   private native int getStackTraceDepth();这两句是从 Throwable 中抄来的,试图也能在我的程序中得到方法的栈调用层次,结果报了找不到动态链接库的异常java.lang.UnsatisfiedLinkError,然后我想这个方法应该是定义在C:\Program Files\Java\jre1.5.0_07\bin\client\jvm.dll  虚拟机种,然后加入。   static{
      System.loadLibrary("C:\\Program Files\\Java\\jre1.5.0_07\\bin\\client\\jvm.dll");
   }还是不对。
我开始产生疑问了
1、平时我用java lib的时候运行到最底层也是native,但是我也没有配置过库路径啊,怎么就能运行?
2、怎么能在自己的类李运行这些函数?

解决方案 »

  1.   

    jvm.dll是自动加载运行的
    如果你有一个dll,需要加载运行,可以这样来做
      

  2.   

    你是一个很有心得程序员,如果你了解c语言的话,就很容易理解其机制了,
    你的异常时因为函数名“getStackTraceDepth()“在加载的动态库中没有发现。
    你用javah会知道其函数名规则,它与定义的private native int “getStackTraceDepth()“有关,
    还与自己所属的类有关。
    不知道解释清楚了没有
      

  3.   

    我大概明白了3楼意思了,也就是说在动态链接库里指定了方法的头文件,将private native int getStackTraceDepth();移到别的类里就不管用了??因为javah变了,找不到了?