1. 程式人生 > >【Java Native】【JNI與JNA效能的比較】

【Java Native】【JNI與JNA效能的比較】

   分別用JNI和JNA的方式建立dll,dll中包含一個get方法和一個set方法,在java端進行迴圈呼叫1000*1000次,比較所耗費的時間。

  JNI和JNA呼叫的不是同一個dll,但是功能和程式碼基本相同。本測試從一定角度反映他們的效能。


1.  JNI實現

1.1.       編寫javaNative方法

package crayon.jni;

public class JNITest {

    public native static void set(int i);

    public native static int get();

    static{

       System.loadLibrary("JNITest");

    }

}

1.2.       生成對應的標頭檔案。使用以下命令:

>javac –d ./JNITest.java

>javah –classpath ./crayon.jni.JNITest

       生成標頭檔案:crayon_jni_JNITest.h

1.3.       建立DLL工程,完成C程式碼實現。(注意,需要將jni的庫檔案引入到工程中。)

#include <jni.h>

#ifndef _Included_crayon_jni_JNITest

#define

_Included_crayon_jni_JNITest

#ifdef __cplusplus

extern "C" {

#endif

JNIEXPORT void JNICALL Java_crayon_jni_JNITest_set

  (JNIEnv *, jclass, jint);

JNIEXPORT jint JNICALL Java_crayon_jni_JNITest_get

  (JNIEnv *, jclass);

#ifdef __cplusplus

}

#endif

#endif

#include "stdafx.h"

#include "JNITest.h"

long tmp = 0;

JNIEXPORT void JNICALL Java_crayon_jni_JNITest_set

         (JNIEnv *, jclass, jint value){

                   tmp = value;

}

JNIEXPORT jint JNICALL Java_crayon_jni_JNITest_get

         (JNIEnv *, jclass){

                   return tmp;

}

生成對應的dll。

1.4.       測試程式碼

package crayon.jni;

public class TestJNI {

    public static void main(String[] args) {

       long beginTime = System.currentTimeMillis();

       int i;int j;

       for(i=0;i<1000;i++){

           for(j=0;j<1000;j++){

              JNITest.set(i*j);

              JNITest.get();

           }

       }

       long totalTime = System.currentTimeMillis()-beginTime;

       System.out.println("JNI消耗的總時間(ms):"+totalTime);

    }

}

// 輸出結果

JNI消耗的總時間(ms):16

2.  使用JNA方式實現

2.1.       建立DLL工程,完成C程式碼實現。

#ifdef JNATEST_EXPORTS

#define JNATEST_API __declspec(dllexport)

#else

#define JNATEST_API __declspec(dllimport)

#endif

extern "C" {

         JNATEST_API void set(long l);

         JNATEST_API long get();

}

#include "stdafx.h"

#include "JNATest.h"

long tmp;

JNATEST_API void set(long l){

         tmp = l;

}

JNATEST_API long get(){

         return tmp;

}

2.2.       編寫java端的interface。別忘了引入jna的庫。

package crayon.jna;

import com.sun.jna.Library;

import com.sun.jna.Native;

public interface JNATest extends Library {

    JNATest INSTANCE = (JNATest) Native.loadLibrary(

                "D:/CC/Tools_Tool_ITT_StdPrj_Dev/PF_Tools_VOB/Tools_SubTool/src/JNATest/Release/JNATest", JNATest.class);

    public void set(int i);

    public int get();

}

2.3.       測試程式碼

package crayon.jna;

import com.sun.jna.Library;

import com.sun.jna.Native;

public interface JNATest extends Library {

    JNATest INSTANCE = (JNATest) Native.loadLibrary(

                "D:/CC/Tools_Tool_ITT_StdPrj_Dev/PF_Tools_VOB/Tools_SubTool/src/JNATest/Release/JNATest", JNATest.class);

    public void set(int i);

    public int get();

}

// 輸出結果

JNA消耗的總時間(ms):2593

3.  結論

JNI消耗的總時間(ms)

JNA消耗的總時間(ms)

16

2593

效能:JNI>> JNA