【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 #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