Java熱門培訓內容之java 本地接口

時間:2018-06-22 14:49:45

Java本地接口(JNI)是為java編寫本地方法和jvm嵌入本地應用程序的標準的應用程序接口。首要的目標是在給定的平臺上通過所有的jvm來實現兼容的二進制編碼本地方法庫。

當使用經典的虛擬機時,Java2 SDK支持早期的本地方法接口(Native Method Interface)。 NMI是最初在JDK1.0實現的,NMI并不是java平臺標準的一部分。

這個指南告訴你怎么把本地方法集成到你的java程序里面,你將會學會怎樣寫本地方法,本地方法是一種使用其他語言來實現的方法,比如C.

 

JNI 概述:

JNI是一個本地編程接口,使用JNI務必保證你的代碼能夠在所有的平臺在完全兼容。當某些應用程序不能完全通過java實現的情況下,程序員就可以使用JNI來寫本地接口方法來處理這些情況,例如,你可能需要使用這些本地方法和JNI在下面的情況:

·在你的應用程序里面,java類庫可能不能支持獨立平臺的一些特征

·你可能有一些其他語言寫好的鏈接庫,并且你希望通過java應用程序來訪問這些鏈接庫

·你可能想要通過低級語言來實現一部分效率要求很高的代碼,比如匯編,然后通過java應用程序來調用它。

一 個本地方法可以創建java對象,包括數組和字符串,然后檢查和使用這些對象來執行某些任務。一個本地方法也可以更新由它創建或被傳進來的java對象, 并且這些被更新的對象對于java程序來說同樣有效。因此,無論是本地語言部分還是java語言部分都可以創建、更新和訪問java對象,并且在他們之間 共享這些變量。

JNI允許你在本地方法中使用java語言。具體的說,你可以在本地方法中catch and throw 異常,并且把異常處理交給java應用程序來處理。本地方法同時也可以獲取java類信息。通過調用JNI函數,本地方法可以加載java類和獲取類信 息。最后,本地方法能使用JNI來執行時時的類型檢查。

 下圖解釋了傳統的C語言如何使用JNI連接java庫,并調用java方法,使用java類等

 

下圖是java應用程序調用本地方法,顯示了許多java程序利用JNI的可能性,包括調用C方法,C++類,調用匯編例程等等

很容易看到,JNI像膠水一樣把java應用程序和本地應用程序粘在了一起

 待續 。。。

關于jni的測試

環境 jdk1.4.2_08;  vc6.0;  winxp sp1

1.編寫java程序

//Filename:JNITest.java

public class JNITest{

    public native void sayHello();
    public native int getInt();
    public native void setInt(int i);

    static{
        System.loadLibrary("testdll");
    }

    public static void main(String[] args){
        JNITest test = new JNITest();
        test.sayHello();
        System.out.println(test.getInt());
        test.setInt(100);
        System.out.println(test.getInt());
    }
}

2.編譯java程序

javac JNITest.java

3.生成.h文件

javah JNITest

4.用生成的.h文件編寫連接庫(本例使用vc6.0)

JNITest.cpp如下

#include "JNITest.h"


int i = 0;

/*
 * Class:     JNITest
 * Method:    sayHello
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_JNITest_sayHello
(JNIEnv *, jobject){

 printf("Hello,world!\n");
}

/*
 * Class:     JNITest
 * Method:    getInt
 * Signature: ()I
 */
JNIEXPORT jint JNICALL Java_JNITest_getInt
(JNIEnv *env, jobject o){
 return i;
}

/*
 * Class:     JNITest
 * Method:    setInt
 * Signature: (I)V
 */
JNIEXPORT void JNICALL Java_JNITest_setInt
(JNIEnv *env, jobject o, jint ji){

 i = ji;
}

5.把編譯好的testdll文件copy到class目錄下

6.運行java程序

java JNITest

輸入結果

Hello,world!
0
100

? 江苏快3号码表