在Dalvik虚拟机里,提供了一些JNI的调用测试函数,以便确认JNI的机制是否可以运行,JNI调用效率是否达到设计的目标,它是通过在registerSystemNatives函数初始化,然后调用jniRegisterSystemMethods函数来设置JNI函数。
JNI的测试函数代码如下:
/*
* JNI registration
*/
staticJNINativeMethodgMethods[] = {
/*name, signature, funcPtr */
{ "emptyJniStaticMethod0", "()V", emptyJniStaticMethod0 },
{ "emptyJniStaticMethod6", "(IIIIII)V",emptyJniStaticMethod6 },
{ "emptyJniStaticMethod6L",
"(Ljava/lang/String;[Ljava/lang/String;[[I"
"Ljava/lang/Object;[Ljava/lang/Object;[[[[Ljava/lang/Object;)V",
emptyJniStaticMethod6L },
};
这段代码是提供JNI测试函数的接口和相关实现的C函数入口。
intregister_org_apache_harmony_dalvik_NativeTestTarget(JNIEnv*env)
{
intresult = jniRegisterNativeMethods(env,
"org/apache/harmony/dalvik/NativeTestTarget",
gMethods,NELEM(gMethods));
这段代码把JNI调用接口设置到包org.apache.harmony.dalvik.NativeTestTarget下面,这样在Java的应用程序里就可以调用了。
if(result != 0) {
/*print warning, but allow to continue */
LOGW("WARNING:NativeTestTarget not registered\n");
(*env)->ExceptionClear(env);
}
return0;
}
/*
* public static voidemptyJniStaticMethod0()
*
* For benchmarks, a do-nothingJNI method with no arguments.
*/
staticvoidemptyJniStaticMethod0(JNIEnv*env, jclassclazz)
{
//This space intentionally left blank.
}
可见这些系统函数的代码,都空的结构,没有真实的代码运行,就可以用来测试JNI是否可以工作,测试JNI调用的时间需要多少,可以提供准确的时间。