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 <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带的头文件,所以编译的时候包含它

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值