虽然Java是一门与操作系统无关、无须编译即可移植到不同平台的语言,但实现这些可移植性的机制是通过编写和操作系统有关的代码来完成的,而这些代码一般是由C/C++来实现的。也就是说,Java虚拟机需要这些和操作系统相关的代码来实现可移植性,所以就必须在Java代码和这些系统相关代码中提供一种接口,即JNI (Java Native Interface)Java本地接口

基本操作 编辑

为实现本地接口,Java提供了native这个关键字,该关键字是用于类的成员函数或者是类函数之上的,举例如下:

package test;

public class Calculator {
    public static native int add(int x1, int x2);
}

上面的例子申明了一个叫Calculator的类,其中的函数int add(int x1, int x2)用系统本地代码实现整型数的加法,并且返回结果。在这里,我们在函数头用native表明这是一个本地函数,并且这样的函数不能有函数体。接下来就要实现本地代码了,我们将用C语言来编写这样的代码,为了能提供相关的接口信息,JDK提供了javah.exe来生成.h头文件。

首先编译Calculator.java文件:

javac test/Calculator.java

然后使用javah来生成头文件:

javah test.Calculator

生成的头文件如下所示:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class test_Calculator */

#ifndef _Included_test_Calculator
#define _Included_test_Calculator
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     test_Calculator
 * Method:    add
 * Signature: (II)I
 */
JNIEXPORT jint JNICALL Java_test_Calculator_add
  (JNIEnv *, jobject, jint, jint);

#ifdef __cplusplus
}
#endif
#endif

从生成的头文件我们可以看出,Java提供了jni.h供我们使用其中的数据类型和函数。

jni.h中提供的函数 编辑