什么是本地方法
在Java中,有些方法涉及到与操作系统交互,获取和使用操作系统的硬件或软件的资源,单纯的用Java实现要么实现很困难,或者不能实现,这时候就要使用本地方法,本地方法就是用其他语言写的方法,然后在JVM中调用
本地方法的定义
本地方法在很多类中都有所见,比如Object类的clone方法
protected native Object clone() throws CloneNotSupportedException;
所以在使用clone方法的时候,实际上会调用C语言写的方法
什么时候使用本地方法
- 你的应用需要访问的系统特性和设备通过Java平台无法实现
- 你已经有了大量的测试过和调试过的用另一种语言编写的代码,并且知道如何将其导出到所有目标平台上
- 通过基准测试,你发现所编写的Java代码比用其他语言编写的代码要慢的多
Java平台有一个用于和本地C代码进行互相操作的API,称为Java本地接口(JNI)
从Java程序中调用C函数
首先定义一个本地方法
public class HelloNative {
public static native void greeting();
}
本地方法对应的C函数命名规则
1. 使用完整的Java方法名,比如HelloNative.greeting.如果类属于某一个包,则加上报名,比如com.hehe.HelloNative.greeting
2. 用下划线替换掉所有的句号,并加上Java_前缀,比如,Java_HelloNative_greeting
3. 如果类名含有非ASCII字母或数字,如’_’,或是大于’\u007F’的unicode字符,用_0xxxx来代替他们,xxxx是该字符的Unicode值的4个十六进制数序列
Java提供了一个工具javah来生成本地C函数的一个头文件,里面包含了本地函数的声明,我们可以使用它
先编译HelloNative
javac HelloNative.java
再使用javah生成C头文件
javah HelloNative
生成一个HelloNative.h
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloNative */
#ifndef _Included_HelloNative
#define _Included_HelloNative
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: HelloNative
* Method: greeting
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_HelloNative_greeting
(JNIEnv *, jclass);
#ifdef __cplusplus
}
#endif
#endif
使用VC++6.0编写HelloNative.c
编译到系统库
上面的HelloNative.h中的jni.h是JDK带的头文件,所以编译的时候包含它