翻开java里对object定义的文件,我看到很多nativ方法
 如:public class Object {    private static native void registerNatives();
    static {
        registerNatives();
    }
    public final native Class<?> getClass();
    public native int hashCode();
    protected native Object clone() throws CloneNotSupportedException;
    public final native void notify();    public final native void notifyAll();    public final native void wait(long timeout) throws InterruptedException;}
但很多介绍jni的入门文章中都说,要用System.loadLibrary("动态连接") 来加载外部逻辑.但我都没找到这个加载呀.
能不能告诉java是怎么加载这些外部逻辑的呢.
谢谢先!!

解决方案 »

  1.   

    http://blog.csdn.net/Mr_Von/archive/2008/09/04/2878508.aspx
    LZ可以看一下!
      

  2.   

    谢谢楼上的,看了你给我的帖子,但你的里面有一句
    System.loadLibrary("NativeCode"); 而我想问下,java在加载那写本地接口时,是怎么加载的?我都没看到  System.loadLibrary 这句啊```我只想问这一句写在了哪里?
      

  3.   

    晕死.刚刚写了那么多竟然没发送成功.这个方法是System类的.方法源码是:
    public static void loadLibrary(String libname) {
    Runtime.getRuntime().loadLibrary0(getCallerClass(), libname);
        }
    一般情况下,JAVA是不能调用标准动态库的,你需要用jni技术写一个自己的动态库,比如我项目调用硬件的一个例子:public class DouDeLi { private static DouDeLi doudeli = null;
    public static DouDeLi getInstance(){
    if(doudeli == null)
    doudeli = new DouDeLi();
    return doudeli;
    } //这里调用JQCardA.dll动态库
    static{
    System.loadLibrary("JQCardA");
    }

    /**
     * 功能: 用来打开一个串行端口, 在做所有的操作之前, 请调用此函数来设置并打开一个有效的串行端口,
     * 否则调用其他函数将无法返回正确结果。
    参数说明:
    PortNum 是一个正整数, 表示用户想打开的串行端口号, 一般为1 或2, 如果用户扩展了PC 机的串
    行端口,也可以使用其它, 但是一般小于10。
    Note: 在调用此函数时,请选择一个有效的端口号, ( 没被其它设备占用且存在的端口), 如果端
    口无效,则返回false。 打开端口成功, 则返回true,
     */
    native public boolean openCommPort(int port);

    /**
     * 功能: 用来关闭用OpenCommPort函数打开的端口。
     *  如果关闭端口成功, 将返回TRUE, 否则返回FALSE。
     */
    native public boolean closeCommPort();
    /**
     * NOTE:在返回的16位数据串中:1-2位是用十六进制表示的考勤机地址,它转换后应该等于ADDR(可以
     * 参考GatherData函数中的举例),3-4位是“07”,5-6位是“04”或“09”(它代表清除读卡标志位,
     * “04”表示正常的卡号的标志,“09”表示已被清除的标志。使用者可以根据它来处理该数据串)7-16
     * 位是读到的卡号。
     */
    native public String readCardNo(int addr);.....这里其它方法省略这样子写好后就用jni生成一个.h文件,你用C或C++就可以写自己的动态库调用标准动态库了.
      

  4.   

    晕死.刚刚写了那么多竟然没发送成功.这个方法是System类的.方法源码是:
    public static void loadLibrary(String libname) {
    Runtime.getRuntime().loadLibrary0(getCallerClass(), libname);
        }
    一般情况下,JAVA是不能调用标准动态库的,你需要用jni技术写一个自己的动态库,比如我项目调用硬件的一个例子:public class DouDeLi { private static DouDeLi doudeli = null;
    public static DouDeLi getInstance(){
    if(doudeli == null)
    doudeli = new DouDeLi();
    return doudeli;
    } //这里调用JQCardA.dll动态库
    static{
    System.loadLibrary("JQCardA");
    }

    /**
     * 功能: 用来打开一个串行端口, 在做所有的操作之前, 请调用此函数来设置并打开一个有效的串行端口,
     * 否则调用其他函数将无法返回正确结果。
    参数说明:
    PortNum 是一个正整数, 表示用户想打开的串行端口号, 一般为1 或2, 如果用户扩展了PC 机的串
    行端口,也可以使用其它, 但是一般小于10。
    Note: 在调用此函数时,请选择一个有效的端口号, ( 没被其它设备占用且存在的端口), 如果端
    口无效,则返回false。 打开端口成功, 则返回true,
     */
    native public boolean openCommPort(int port);

    /**
     * 功能: 用来关闭用OpenCommPort函数打开的端口。
     *  如果关闭端口成功, 将返回TRUE, 否则返回FALSE。
     */
    native public boolean closeCommPort();
    /**
     * NOTE:在返回的16位数据串中:1-2位是用十六进制表示的考勤机地址,它转换后应该等于ADDR(可以
     * 参考GatherData函数中的举例),3-4位是“07”,5-6位是“04”或“09”(它代表清除读卡标志位,
     * “04”表示正常的卡号的标志,“09”表示已被清除的标志。使用者可以根据它来处理该数据串)7-16
     * 位是读到的卡号。
     */
    native public String readCardNo(int addr);.....这里其它方法省略这样子写好后就用jni生成一个.h文件,你用C或C++就可以写自己的动态库调用标准动态库了.
      

  5.   

    呵呵.网络有问题,发了两次,不好意思.仔细看了一下你的回复,其实关于JAVA调用本地化接口的原理你不用理解太清楚,只要会用就可以啦,既然是静态方法,肯定是程序在初使化就已经加载了.你如果用eclipse可以自己调试一下那个System.loadLibrary是什么时候加载.如果你写的动态库没问题的话就可以直接拿来用了.
      

  6.   

    我也晕哦```其实我只有一个问题,你可以打开object.java这个文件,既JDK里的src.zip里的.里面有很多本地方法```
    当我调用object.hashCode()的时候,很明显方法返回了结果,但在原码里我都没看到哪里加载了动态连接.即外部逻辑.我只想知道,java在什么时候加载的动态连接,加载的代码(System.loadLibrary)在哪儿写着呢.大家别想错了呀`
      

  7.   

    晕倒! 看你写的这句话咋矛盾呢?谢谢楼上的,看了你给我的帖子,但你的里面有一句 
    System.loadLibrary("NativeCode"); 
    ===在这里看到 System.loadLibrary("NativeCode"); ===我都没看到  System.loadLibrary 这句啊```  这里又说没看到!   在那篇文章里写的很清楚了哦   你可以自己在本机上写一段代码运行的嘛!  
       System.loadLibrary("NativeCode");  //这里的"NativeCode" 就是在那篇文章中的{4、将C/C++源文件编译成动态连接库(DLL) 
    操作: 
    -->右击IDE左上角NativeCode工程选择生成(在NativeCode项目的子文件夹Debug下的NativeCode.dll文件)} 生成的文件啊.呵  还是建议LZ现在自己的机器上搭建一个C++的环境  然后做一个简单的例子   估计按照步骤做下来大概的东西你就清楚了.
      

  8.   


    哦?  JAVA本身的代码有用到JNI吗?   JAVA只是提供了System.loadLibrary();方法让程序员去调用本地接口而已.  如果JAVA本身使用到了JNI估计就不会"一次编译,到处运行了"
    建议LZ看一下http://www.itisedu.com/phrase/200604261218435.html 或在网上搜一下JNI相关资料看一下。
      

  9.   

    这些都是JVM后台干的事情,当然不想让你看到了
      

  10.   


    你可以看下 java的原代码哦``OBJECT.JAVA里都定义了很多native方法呢`