面向对象的陷阱——native方法的陷阱

来源:互联网 发布:山东塑胶跑道标准数据 编辑:程序博客网 时间:2024/05/21 07:53

4、native方法的陷阱

       在Java方法定义中有一类特殊的方法:native方法。对于native方法而言,Java程序不会为该方法提供实现体。
public class NativeTest {public native void info();}
       使用native修饰的方法就像一个“抽象方法”,只有方法签名,没有方法体。从这个意义上来说,native关键字和abstract关键字有点类似。不过,native方法通常需要借助C语言来完成,即需要使用C语言为Java方法提供实现。其实现步骤如下。
  1. 用javah编译第一步生成的class文件,将产生一个.h文件。
  2. 写一个.cpp文件实现native方法, 其中需要包含第1步产生的.h文件(.h文件中又包含了JDK带的jni.h文件)。
  3. 将第2步的.cpp文件编译成动态链接库文件。
  4. 在Java中用system的loadLibrary()方法或Runtime的loadLibrary()方法加载第3步产生的动态链接库文件,就可以在Java程序中调用这个native方法。
       这里需要注意的是,在第3步编译.cpp文件时,将会使得该程序依赖于当前的编译平台。也就是说,native方法做不到跨平台,它在不同的平台上可能表现出不同的行为。
public class SleepTest {public static void main(String[] args) throws Exception{long start = System.currentTimeMillis();Thread.sleep(2);System.out.println(System.currentTimeMillis() - start);}}
       尝试编译、运行上面程序,如果使用Windows XP系统的,大部分都会输出0,极少数机会输出16,;如果使用win7系统的,大部分会输出16.这个运行结果非常的奇怪,当查看JDK关于Thread.sleep()方法的介绍,发现有如下的解释:让当前执行的线程sleep(暂停)指定的毫秒数,具体暂停多少毫秒取决于系统计时器的精度。也就是说,Thread的sleep()方法其实是一个native方法。
       上面程序给出的教训是,千万不要过度相信JDK提供的方法。虽然Java语言本身是跨平台的,但Java的native方法还是要依赖于具体的平台,尤其是JDK所提供的方法,更是包含了大量的native方法。使用这些方法时,要注意它们在不同平台上可能出现的差异。


1 0
原创粉丝点击