分别用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