学习JCVM之一本地方法
来源:互联网 发布:纵横公路预算软件 编辑:程序博客网 时间:2024/06/14 09:08
学习JCVM之一本地方法
我是2011-7-6日入职的,我是刚毕业的应届生,我没有学习过JAVA,对JAVA一点也不了解,更何况JAVA的核心部分虚拟机了,但是领导安排了我就的去看、去做。JCVM是所有JVM中开源资料最少的,在网上根本找不到源码。还好公司里有,光有源码不行啊,对这个虚拟机的结构我是一点也不了解啊,今天看了一些本地方法的知识,我是菜鸟,就把自己理解的一些知识分享一下:
本地方法就是直接和硬件打交道的一个软件模块,由虚拟机来执行调用。当我们的JAVA应用程序声明了本地方法就会通过虚拟就调用本地方法,本地方法中主要是实现一些对硬件的处理。
一、为什么会有本地方法呢?它的作用是什么?
java使用起来非常方便,然而有些层次的任务用java实现起来不容易,或者我们对程序的效率很在意时,问题就来了。
1>与java环境外交互:
还有其它和硬件有关的操作都是通过本地方法来实现的。
二、JVM怎样使Native Method跑起来
三、实现本地方法的实例(该实例我是从网上看得)
1.装入和链接本地方法
本Java程序的作用是使用一个本地方法print(),代替Java类库中的打印方法System.out.println()。
public class HelloWorld {
private native String print(String s);
public static void main(String[] args) {
String s= new String("HelloWorld");
newHelloWorld().print(s);
}
static {
System.loadLibrary("lib—native.dll ");
}
}
当Java程序运行开始时,调用Java API类库中System类的方法load()装入一个平台相关的本地库,传递给System.load的参数是一个库名,程序员可以用单个库去存储任意数目的类所需要的本地方法。这时虚拟机内部为每个类装入器维持了一个列表,存放已经装入的本地库。如果下层的操作系统不支持动态链接,本地方法库必须预先链接到虚拟机上。意识是说通过应用程序把本地方法的库加载到虚拟机中。
2. 编写本地方法
先给出编写本地方法的例子:
#include <jni.h>
//该头文件是执行命令 javah HelloWord 生成的。
#include <stdio.h>
void Java—HelloWorld—print(JNIEnv *env, jobject obj, jstring jstr)
{
char *str—copy;
const char *str—chars;
int str—length;
str—chars = (*env)->GetStringUTFChars(env, jstr, NULL);
str—length = (*env)->GetStringUTFLength(env, jstr) + 1;
str—copy = (char*) malloc(str—length * sizeof(char));
strncpy(str—copy, str—chars, str—length);
(*env)->ReleaseStringUTFChars(env, jstr, str—chars);
str—copy[str—length-1] = 0;
printf("%s", str—cpy);
return;
}
本地方法的第一个参数是JNI 接口指针,接口指针指向一个指针数组,数组的每个元素指向一个接口函数。本地代码通过调用JNI接口函数访问Java 虚拟机的特定功能。接口指针的结构如图2所示。
第二个参数取决于此方法是静态还是非静态。非静态本地方法的第二个参数是调用本地方法Java类所属对象,静态方法的第二个参数则是调用本地方法Java类。剩下的参数(以对象形式表示)和通常的Java方法参数一致。本地方法将结果通过返回值传递给调用它的程序。
3、在动态库或静态库中解析本地方法
动态链接器的解析完全基于本地方法的名字。本地方法的名字由下面几部分组成:
.前缀 Java—
.类名全称
.下划线的分隔符
.方法名
.为了重载本地方法(同名的本地方法但参数不同),两个 "——"后跟参数的签名。
当虚拟机检查到Java程序中本地方法的关键字native时,立即为本地方法在本地库中检查相匹配的本地方法名。首先检查一个短名,即不带参数类型的名字。然后检查长名(当一个本地方法重载另一个本地方法时)。如果一个本地方法和另一个非本地方法同名,是允许的。非本地方法不驻留在本地库中。
当虚拟机到本地库中检测到相匹配的本地方法名后,随即获得与本地方法名相对应的本地函数的地址(本地方法的代码段), 执行本地库中相关本地函数, 将本地函数返回值进行保存。
- 学习JCVM之一本地方法
- 学习JCVM之二JCVM的工作原理
- maven 学习笔记 之一.本地安装配置
- 学习IT行业方法之一
- Java Card虚拟机(JCVM)
- android get方法访问本地服务器显示refuse原因之一
- HBase学习之一HBase本地模式与伪分布式模式
- Android学习第十天-----本地拒绝服务漏洞之一
- selenium技术学习-定位方法之一
- 不能在本地计算机启动 apache2.2, apache2.2无法启动方法之一
- 《Storm实时数据处理》学习笔记之一:使用Vagrant配置本地集群(上)
- ImageLoader之一加载本地图片
- 本地方法
- 要学习的最主要的解决问题方法之一
- “设计模式”学习之一:工厂方法与抽象工厂
- iOS多线程学习笔记之一:NSThread常用方法
- 【OpenGL】学习笔记之一 绘制基本图形单元的方法
- Java学习笔记之一(深入理解Object类中方法)
- Android:对Service的一点理解2
- 浅谈Java中System.gc()工作原理
- 修改Z-Stack的PAN_ID
- Jump Game II
- 使用bindValue出错,lastError提示QMYSQL3: Unable to bind value .
- 学习JCVM之一本地方法
- 学习JCVM之二JCVM的工作原理
- QT连接SQL(1) QSQLQuery prepare and bindValue
- IntentService的学习
- 用QT编程时遇到的错误总结
- QT中操作数据库(ACCESS、MySql)
- CSS可视化格式模型之宽度、高度
- 算法复习(ustc)-递归与分治-斐波那契数Fibonacci
- Github 修正上传时“this exceeds GitHub’s file size limit of 100 MB”错误