java-native方法总结
native方法的方法体不需在java文件中实现 而在cpp文件中实现?
可以将native方法比作Java程序同C程序的接口,其实现步骤:?
1、在Java中声明native()方法,然后编译;?
2、用javah产生一个.h文件;?
3、写一个.cpp文件实现native导出方法,其中需要包含第二步产生的.h文件(注意其中又包含了JDK带的jni.h文件);?
4、将第三步的.cpp文件编译成动态链接库文件;?
5、在Java中用System.loadLibrary()方法加载第四步产生的动态链接库文件,这个native()方法就可以在Java中被访问了。
?
调用这些方法的其他类甚至不知道它所调用的是一个本地方法。JVM将控制调用本地方法的所有细节
java应用需要与java外面的环境交互。这是本地方法存在的主要原因,如 与操作系统交互:?
? ? ? ? ? ?JVM支持着java语言本身和运行时库,它是java程序赖以生存的平台,它由一个解释器(解释字节码)和一些连接到本地代码的库组成。
? ? ? ? ? ?然而不管怎 样,它毕竟不是一个完整的系统,它经常依赖于一些底层(underneath在下面的)系统的支持。
? ? ? ? ? ?这些底层系统常常是强大的操作系统。通过使用本地方法,我们得以用java实现了jre的与底层系统的交互,甚至JVM的一些部分就是用C写的,
? ? ? ? ? ?还有,如果我们要使用一些java语言本身没有提供封装的操作系统的特性时,我们也需要使用本地方法。
?
public class Object {
? ? ? ? private static native void registerNatives();//告诉JVM有native方法
? ? ? ? static {
? ? ? ? ? ? ? ? registerNatives();
? ? ? ? }
? ? ? ? public final native Class<?> getClass(); ? ? ? ?
? ? ? ? protected native Object clone() throws CloneNotSupportedException;
? ? ? ? /**虽然Class也是extendsObject但不会死循环调
? ? ? ? 因为public String getName() {if (name == null)name = getName0();return name;}
? ? ? ? private native String getName0();也是native的
? ? ? ? */
? ? ? ? public String toString() {
? ? ? ? ? ? ? ? return getClass().getName() + "@" + Integer.toHexString(hashCode());
? ? ? ? }
? ? ? ? //当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。
? ? ? ? protected void finalize() throws Throwable { }
}