本地方法就是直接和硬件打交道的一个软件模块,由虚拟机来执行调用。当我们的JAVA应用程序声明了本地方法就会通过虚拟就调用本地方法,本地方法中主要是实现一些对硬件的处理。
一、为什么会有本地方法呢?它的作用是什么?
java使用起来非常方便,然而有些层次的任务用java实现起来不容易,或者我们对程序的效率很在意时,问题就来了。
1>与java环境外交互:
有时java应用需要与java外面的环境交互。这是本地方法存在的主要原因,你可以想想java需要与一些底层系统如操作系统或某些硬件交换信息时的情况。本地方法正是这样一种交流机制:它为我们提供了一个非常简洁的接口,而且我们无需去了解java应用之外的繁琐的细节。
2>与操作系统交互:
JVM支持着java语言本身和运行时库,它是java程序赖以生存的平台,它由一个解释器(解释字节码)和一些连接到本地代码的库组成。然而不管怎样,它毕竟不是一个完整的系统,它经常依赖于一些底层(underneath在下面的)系统的支持。这些底层系统常常是强大的操作系统。通过使用本地方法,我们得以用java实现了jre的与底层系统的交互,甚至JVM的一些部分就是用C写的,还有,如果我们要使用一些java语言本身没有提供封装的操作系统的特性时,我们也需要使用本地方法。
还有其它和硬件有关的操作都是通过本地方法来实现的。
二、JVM怎样使Native Method跑起来
我们知道,当一个类第一次被使用到时,这个类的字节码会被加载到内存,并且只会回载一次。在这个被加载的字节码的入口维持着一个该类所有方法描述符的list,这些方法描述符包含这样一些信息:方法代码存于何处,它有哪些参数,方法的描述符(public之类)等等。
如果一个方法描述符内有native,这个描述符块将有一个指向该方法的实现的指针。这些实现在一些DLL文件内,但是它们会被操作系统加载到java程序的地址空间。当一个带有本地方法的类被加载时,其相关的DLL并未被加载,因此指向方法实现的指针并不会被设置。当本地方法被调用之前,这些DLL才会被加载,这是通过调用java.system.loadLibrary()实现的
三、实现本地方法的实例(该实例我是从网上看得)
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本地方法的使用
C语言可以实现更多的底层功能,java的平台无关性使其可以移植到更多的平台上,JNI方法可以可以实现两者之间的通信
通过本地方法调用来调用C语言的例子,一个调用时间的,谨供参考
java读取本地.db文件简单方法,sqlite数据库类型文件获取数据
通过Java调用本地方法.pdf
什么是jni本地方法!java里定义的其他语音实现的方法!
JAVA本地方法:native方法1
Java本地接口(Java Native Interface (JNI))允许运行在Java虚拟机(Java Virtual Machine (JVM))上的代码调用本地程序和类库,或者被它们调用,这些程序和类库可以是其它语言编写的,比如C、C++或者汇编语言。...
JNA(Java Native Access )提供一组Java工具类用于在运行期动态访问系统本地库(native library:如Window的dll)而不需要编写任何Native/JNI代码。开发人员只要在一个java接口中描述目标native library的函数与...
深入Java虚拟机——本地方法栈.pdf
java调用本地dll的几种方法性能对比测试。 JNA消耗的总时间(ms):5406 bridj消耗的总时间(ms):984 JNI消耗的总时间(ms):47 包含c++源码和java源码,部署和使用方法。在win7和winxp下测试用过。 部分源码是...
java调用本地化(dll)实用文档, 本文档分别以JNA、jni、JNative举例,详细说明了java调用DLL的方法;
转自:http://www.ibm.com/developerworks/cn/java/jnimthds/ PDF链接:http://pan.baidu.c
将Java应用程序本地编译为EXE的几种方法
java语言后台请求网站操作 java中main方法发送httpPost请求
该文档详细介绍了在Java代码中如何调用C或C++代码。主要思想是:将C或C++代码大包成动态链接库,然后共Java代码在执行时调用。
JAVA读取远程网页文件并保存本地 从远程URL地址获取网页文件下载到本地 这个方法可以生成静态HTML文件使用!
这是一个java通过本地接口访问的源代码,在windows操作系统上试验成功,对于想学本地方法的有 帮助,代码中有JAVA与C语言的原始数据、对象及数组交互,有本地库中抛出例外,构造器调用等知识点,比较全面。
JAVA通过JNI调用本地方法,而本地方法是以库文件的形式存放的(在WINDOWS平台上是DLL文件形式,在UNIX机器上是SO文件形式 )。通过调用本地的库文件的内部方法,使JAVA可以实现和本地机器的紧密联系,调用系统级的各...