资讯库 厂家库 产品库 / 咨询专线:400-6668-369 / 服务时间:8:00-18:00(非节假日)
中国办公家具产业基地,专业助力办公家具单位采购。

创建虚拟机————startVm


 
我们先看三部曲中的第一部:startVm,这个函数没有特别之处,就是调用JNI的虚拟机创建函数,但是创建虚拟机时的一些参数却是在startVm中确定的,其代码如下所示:
 
[-->AndroidRuntime.cpp]
 
intAndroidRuntime:startVm(JavaVM**pJavaVM,JNIEnv**pEnv)
 
{
 
//这个函数绝大部分代码都是设置虚拟机的参数,我们只分析其中的两个。
 
/*
 
下面的代码是用来设置JNIcheck选项的。JNIcheck指的是Native层调用JNI函数时,系统所做的一些检查工作。例如,调用NewUTFString函数时,系统会检查传入的字符串是不是符合UTF-8的要求。JNIcheck还能检查资源是否被正确释放。但这个选项也有副作用,比如:
 
1)因为检查工作比较耗时,所以会影响系统运行速度。
 
2)有些检查过于严格,例如上面的字符串检查,一旦出错,则调用进程就会abort。
 
所以,JNIcheck选项一般只在调试的eng版设置,在正式发布的user版中则不设置该选项了。
 
下面这几句代码就控制着是否启用JNIcheck,这是由系统属性决定的,eng版如经过特殊配置,也可以去掉JNIcheck。
 
*/
 
property_get("dalvik.vm.checkjni",propBuf,"");
 
if(strcmp(propBuf,"true")==0){
 
checkJni=true;
 
}elseif(strcmp(propBuf,"false")!=0){
 
property_get("ro.kernel.android.checkjni",propBuf,"");
 
if(propBuf[0]=='1'){
 
checkJni=true;
 
}
 
}
 
……
 
/*
 
设置虚拟机的heapsize,默认为16MB。绝大多数厂商都会修改这个值,一般是32MB。heapsize不能设置得过小,否则在操作大尺寸的图片时无法分配所需内存。
 
这里有一个问题,即heapsize既然是系统级的属性,那么能否根据不同应用程序的需求来进行动态调整呢?我开始也考虑过能否实现这一构想,不过希望很快就破灭了。对这一问题,我们将在本章的拓展内容中深入讨论。
 
*/
 
strcpy(heapsizeOptsBuf,"-Xmx");
 
property_get("dalvik.vm.heapsize",heapsizeOptsBuf+4,"16m");
 
opt.optionString=heapsizeOptsBuf;
 
mOptions.add(opt);
 
if(checkJni){
 
opt.optionString="-Xcheck:jni";
 
mOptions.add(opt);
 
//JNIcheck中的资源检查,系统中创建的Globalreference个数不能超过2000。
 
opt.optionString="-Xjnigreflimit:2000";
 
mOptions.add(opt);
 
}
 
//调用JNI_CreateJavaVM创建虚拟机,pEnv返回当前线程的JNIEnv变量。
 
if(JNI_CreateJavaVM(pJavaVM,pEnv,&initArgs)<0){
 
LOGE("JNI_CreateJavaVMfailed\n");
 
gotobail;
 
}
 
result=0;
 
bail:
 
free(stackTraceFile);
 
returnresult;
 
}
 
关于dalvik虚拟机的详细参数,读者可以参见Dalvik/Docs/Dexopt.html中的说明。这个Docs目录下的内容,或许可帮助我们更深入地了解dalvik虚拟机。
 

相关资讯