Java中native关键字
来源:互联网 发布:位面小蝴蝶知乎 编辑:程序博客网 时间:2024/06/06 06:29
http://blog.csdn.net/funneies/article/details/8949660
今日在hibernate源代码中遇到了native关键词,甚是陌生,就查了点资料,对native是什么东西有了那么一点了解,并做一小记。
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.将本地方法编写的文件生成动态链接库
以下是一个在Java中调用本地C程序的简单的例子:
a.编写HelloWorld.java类
class HelloWorld{
public native void hello();
static{
System.loadLibrary(“hello”);
}
public static void main(String[] args){
new HelloWorld().hello();
}
}
b.编译
javac HelloWorld.java
c.生成.h文件
javah -jni HelloWorld
生成内容如下:
/* DO NOT EDIT THIS FILE - it is machine generated */
include
ifndef _Included_HelloWorld
define _Included_HelloWorld
ifdef __cplusplus
extern “C” {
endif
/*
* Class: HelloWorld
* Method: hello
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_HelloWorld_hello
(JNIEnv *, jobject);
ifdef __cplusplus
}
endif
endif
第一个参数是调用JNI方法时使用的JNI Environment指针。第二个参数是指向在此Java代码中实例化的Java对象HelloWorld的一个句柄。其他参数是方法本身的参数
d.c实现
include
include “HelloWorld.h”
include
- java 中native关键字
- Java中Native关键字
- Java中Native关键字
- Java中native关键字
- java中Native关键字
- java中native关键字
- java中native 关键字
- Java中native关键字
- Java中native关键字
- Java中native关键字
- Java中native关键字
- java中native关键字
- Java中native关键字
- Java中native关键字
- Java中native关键字
- Java中native关键字
- Java中native关键字
- Java中native关键字
- struts2学习之---Convention插件与"约定"支持
- Android串口通信10进制转16进制
- Linux下的文件操作权限
- android 获取路径目录方法以及判断目录是否存在,创建目录
- java的数据类型
- Java中native关键字
- Mobilenet_YOLO
- Android给空包签名
- MySQL
- Spring对JDBC的 整合支持 \Spring+JDBC Template
- Zookeeper的功能以及工作原理
- 前端开发规范手册(二)--HTML
- 使用 Maven Profile 和 Filtering 打各种环境的包
- Spring Boot基础