PerformanceTest.java
package com.jni;</p><p>import android.app.Activity;<br />import android.os.Bundle;<br />import android.util.Log;</p><p>public class PerformanceTest extends Activity {<br />static<br />{<br />try<br />{<br />System.loadLibrary("PerformanceTest");<br />} catch (UnsatisfiedLinkError ule)<br />{<br />System.err.println("WARNING: Could not load library!");<br />}<br />}<br />private final String PerformanceTestTAG ="PerformanceTest:performanceTestFunc :";<br />/* JNI 測試函數 */<br />private native void emptyJniFunction();<br />/* JAVA測試函數 */<br />private void emptyJavaFunction()<br />{</p><p>}<br /> /** Called when the activity is first created. */<br /> @Override<br /> public void onCreate(Bundle savedInstanceState) {<br /> super.onCreate(savedInstanceState);<br /> setContentView(R.layout.main);<br /> performanceTestFunc();<br /> }<br /> /* 效能測試函數 */<br /> public void performanceTestFunc()<br /> {<br /> /* 測試數量級為100萬次 */<br />int mLoopCount = 1000000;<br />int i = 0;<br />int base = 1000000;<br />String timeStr_ms;/* 毫秒對應String*/<br />/* 精確度為納秒級 */<br />long startTime = System.nanoTime();<br />/* JNI 調用 */<br />for(i = 0;i <= mLoopCount; ++ i)<br />{<br />emptyJniFunction();<br />}<br />long endTime = System.nanoTime();<br />timeStr_ms = String.valueOf((endTime-startTime)/base);<br />Log.v(PerformanceTestTAG+"In Jni:", timeStr_ms+"ms");<br />startTime = System.nanoTime();<br />/* JAVA 調用 */<br />for(i = 0;i <= mLoopCount; ++ i)<br />{<br />emptyJavaFunction();<br />}<br />endTime = System.nanoTime();<br />timeStr_ms = String.valueOf((endTime-startTime)/base);<br />Log.v(PerformanceTestTAG+"In JAVA:", timeStr_ms+"ms");<br /> }<br />}
com_jni_PerformanceTest.c
/* DO NOT EDIT THIS FILE - it is machine generated */<br />#include <jni.h><br />/* Header for class com_jni_PerformanceTest */</p><p>#ifndef _Included_com_jni_PerformanceTest<br />#define _Included_com_jni_PerformanceTest<br />#ifdef __cplusplus<br />extern "C" {<br />#endif<br />/*<br /> * Class: com_jni_PerformanceTest<br /> * Method: emptyJniFunction<br /> * Signature: ()V<br /> */<br />JNIEXPORT void JNICALL Java_com_jni_PerformanceTest_emptyJniFunction<br /> (JNIEnv *env, jobject obj)<br />{</p><p>}<br />JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved)<br />{<br />JNIEnv *env;<br />int result;</p><p>result = JNI_VERSION_1_4;<br />return result;</p><p>}<br />#ifdef __cplusplus<br />}<br />#endif<br />#endif<br />
Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := PerformanceTest
LOCAL_SRC_FILES := src/com_jni_PerformanceTest.c
include $(BUILD_SHARED_LIBRARY)
如所示,通過Jni調用c的空實現函數,調用100萬次,用時41747ms,而使用java調用java的空實現函數100萬次,用時25378ms。以上測試數量級為100萬次,系統android 2.2,測試於android模擬器上,jdk1.6.0_17。