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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Never_Blue/article/details/71102093

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方法。使用这些方法时,要注意它们在不同平台上可能出现的差异。


展开阅读全文

没有更多推荐了,返回首页