Java/JNI

維基教科書,自由的教學讀本

雖然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中提供的函數[編輯]