Java本地方法

什么是本地方法

在Java中,有些方法涉及到与操作系统交互,获取和使用操作系统的硬件或软件的资源,单纯的用Java实现要么实现很困难,或者不能实现,这时候就要使用本地方法,本地方法就是用其他语言写的方法,然后在JVM中调用

本地方法的定义

本地方法在很多类中都有所见,比如Object类的clone方法

protected native Object clone() throws CloneNotSupportedException;

所以在使用clone方法的时候,实际上会调用C语言写的方法

什么时候使用本地方法

  1. 你的应用需要访问的系统特性和设备通过Java平台无法实现
  2. 你已经有了大量的测试过和调试过的用另一种语言编写的代码,并且知道如何将其导出到所有目标平台上
  3. 通过基准测试,你发现所编写的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 
/* 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
Java本地方法_第1张图片

Java本地方法_第2张图片
编译到系统库
上面的HelloNative.h中的jni.h是JDK带的头文件,所以编译的时候包含它

你可能感兴趣的:(Java)