JAVA native关键字

来源:互联网 发布:龙跃qq软件 编辑:程序博客网 时间:2024/06/08 07:56

今天在看Thread源码时发现native关键字的存在,查阅资料get到一些新的知识,记录一下。

知识点

(1)native只能修饰方法,而且被native修饰的方法没有方法体。
(2)标识符native可以与所有其它的java标识符连用,但是abstract除外。
(3)被native修饰的方法没有具体实现,其实跟我Java中接口或者抽象类中的抽象方法类似,只是我们抽象方法是由具体实现接口或继承抽象类的子类去实现,而native method是一份java调用非java代码的接口,即由非Java代码实现的(比如可以用c、c++实现)。
(4)一个native method方法可以返回任何java类型,包括非基本类型,而且同样可以进行异常控制。这些方法的实现体可以自制一个异常并且将其抛出,这一点与java的方法非常相似。
(5)native method的存在并不会对其他类调用这些本地方法产生任何影响,实际上调用这些方法的其他类甚至不知道它所调用的是一个本地方法。JVM将控制调用本地方法的所有细节。

使用方法

native关键字说明其修饰的方法是一个原生态方法,方法对应的实现不是在当前文件,而是在用其他语言(如C和C++)实现的文件中。Java语言本身不能对操作系统底层进行访问和操作,但是可以通过JNI接口调用其他语言来实现对底层的访问。

JNI是Java本机接口(Java Native Interface),是一个本机编程接口,它是Java软件开发工具箱(Java Software Development Kit,SDK)的一部分。JNI允许Java代码使用以其他语言编写的代码和代码库。Invocation API(JNI的一部分)可以用来将Java虚拟机(JVM)嵌入到本机应用程序中,从而允许程序员从本机代码内部调用Java代码。

不过,对Java外部的调用通常不能移植到其他平台,在applet中还可能引发安全异常。实现本地代码将使您的Java应用程序无法通过100%纯Java测试。但是,如果必须执行本地调用,则要考虑几个准则:

(1).将您的所有本地方法都封装到一个类中,这个类调用单个的DLL。对每一种目标操作系统平台,都可以用特定于适当平台的版本的DLL。这样可以将本地代码的影响减少到最小,并有助于将以后所需要的移植问题考虑在内。

(2).本地方法尽量简单。尽量使您的本地方法对第三方(包括Microsoft)运行时DLL的依赖减少到最小。使您的本地方法尽量独立,以将加载您的DLL和应用程序所需的开销减少到最小。如果需要运行时DLL,必须随应用程序一起提供。

JNI的书写步骤

a.编写带有native声明的方法的Java类
b.使用javac命令编译编写的Java类
c.使用java -jni **来生成后缀名为.h的头文件
d.使用其他语言(C、C++)实现本地方法
e.将本地方法编写的文件生成动态链接库
创建本地方法的示例参考
https://www.ibm.com/developerworks/cn/java/jnimthds/

其他参考资料

http://docs.oracle.com/javase/1.5.0/docs/guide/jni/spec/jniTOC.html

原创粉丝点击