【Java Native】【JNI与JNA性能的比较】

来源:互联网 发布:可以看韩剧的软件 编辑:程序博客网 时间:2024/05/21 09:29

   分别用JNI和JNA的方式建立dll,dll中包含一个get方法和一个set方法,在java端进行循环调用1000*1000次,比较所耗费的时间。

  JNI和JNA调用的不是同一个dll,但是功能和代码基本相同。本测试从一定角度反映他们的性能。

   【相关代码】【JNI与JNA性能比较】下载:http://download.csdn.net/detail/crayonyi/4187992

   本篇文章文档下载:http://download.csdn.net/detail/crayonyi/4187998


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