Native是一个计算机函数,一个native method就是一个java调用非Java代码的接口。方法的实现由非java语言实现,比如C或C++。
一个java method方法可以返回任何java类型,包括非基本类型,而且同样可以进行异常控制。这些方法的实现体可以制一个异常并且将其抛出,这一点 与java的方法非常相似。当一个native method接受到 一些非基本类型时如object或一个整型数组时,这个方法可以访问非基本型的内部,但是这将使这个native方法依赖于你所访问的java类的实现。
java method的存在并不存在并不会对其他类调用这些本地方法产生影响,实际上调用这些方法的其他类甚至不知道他所调用的一个本地方法。jvm将控制调用本地方法的所有细节。需要注意当我们讲一个本地方法声明finat的情况。用java实现的方法体在被编译时的可能因为内联而产生效率上的提升。但是一个native finat方法是否也能获得这样的好处确实值得怀疑的。但是这只是一个代码优化的问题,对功能实现没有影响。
如果一个含有本地方法的类被继承,子类会继承这个本地方法并且可以用java语言重写这个方法、同样的如果一个本地方法被finat标识,它被继承后不能被重写。
本地方法非常有用,因为它有效的扩充了JVM。事实上,我们所写的java代码已经用到了本地方法,在Sun的java的并发(多线程)的机制实现中,许多与操作系统的接触都用到了本地方法,这使得java程序能够超越java运行时的界限。有了本地方法,java程序可以做任何应用层次的任务。
Jvm与Native method
当一个类被使用时,这个类的字节码被加载到内存,并且只会回载一次。在这个被加载的字节码的入口维持这一个类所有的方法描述符的list,这些方法包含这样一些信息;方法代码存<・)))><<何处,它有哪些参数、方法的描述符(public之类)等等。
如果一个方法描述符内有native,这个描述符块将有一个指向该方法的实现的指针。这些实现在一些DLL文件内,但是它们会被操作系统加载到java程序的地址空间。当一个带有本地方法的类被加载时,其相关的DLL并未被加载,因此指向方法实现的指针并不会被设置。当本地方法被调用之前,这些DLL才会被加载,这是通过调用java.system.loadLibrary()实现的。