PerformanceTest.java
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
public class PerformanceTest extends Activity {
static
{
try
{
System.loadLibrary("PerformanceTest");
} catch (UnsatisfiedLinkError ule)
{
System.err.println("WARNING: Could not load library!");
}
}
private final String PerformanceTestTAG ="PerformanceTest:performanceTestFunc :";
/* JNI 测试函数 */
private native void emptyJniFunction();
/* JAVA测试函数 */
private void emptyJavaFunction()
{
}
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
performanceTestFunc();
}
/* 性能测试函数 */
public void performanceTestFunc()
{
/* 测试数量级为100万次 */
int mLoopCount = 1000000;
int i = 0;
int base = 1000000;
String timeStr_ms; /* 毫秒对应String*/
/* 精确度为纳秒级 */
long startTime = System.nanoTime();
/* JNI 调用 */
for(i = 0;i <= mLoopCount; ++ i)
{
emptyJniFunction();
}
long endTime = System.nanoTime();
timeStr_ms = String.valueOf((endTime-startTime)/base);
Log.v(PerformanceTestTAG+"In Jni:", timeStr_ms+"ms");
startTime = System.nanoTime();
/* JAVA 调用 */
for(i = 0;i <= mLoopCount; ++ i)
{
emptyJavaFunction();
}
endTime = System.nanoTime();
timeStr_ms = String.valueOf((endTime-startTime)/base);
Log.v(PerformanceTestTAG+"In JAVA:", timeStr_ms+"ms");
}
}
com_jni_PerformanceTest.c
#ifndef _Included_com_jni_PerformanceTest
#define _Included_com_jni_PerformanceTest
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_jni_PerformanceTest
* Method: emptyJniFunction
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_com_jni_PerformanceTest_emptyJniFunction
(JNIEnv *env, jobject obj)
{
}
JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved)
{
JNIEnv *env;
int result;
result = JNI_VERSION_1_4;
return result;
}
#ifdef __cplusplus
}
#endif
#endif
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。