详细分析Android中实现Zygote的源码

2020-01-06 13:36:52丽君
  • // 1. 创建虚拟机  if (startVm(&mJavaVM, &env) != 0) { 
  • return;  } 
  • onVmCreated(env);   
  • // 2. 注册JNI函数  if (startReg(env) < 0) { 
  • ALOGE("Unable to register all android nativesn");  return; 
  • }   
  • jclass stringClass;  jobjectArray strArray; 
  • jstring classNameStr;  jstring optionsStr; 
  •   stringClass = env->FindClass("java/lang/String"); 
  • assert(stringClass != NULL);  // 创建一个有两个元素的String数组,用Java代码表示为:String[] strArray = new String[2]; 
  • strArray = env->NewObjectArray(2, stringClass, NULL);  assert(strArray != NULL); 
  • classNameStr = env->NewStringUTF(className);  assert(classNameStr != NULL); 
  • // 设置第一个元素为"com.android.internal.os.ZygoteInit"  env->SetObjectArrayElement(strArray, 0, classNameStr); 
  • optionsStr = env->NewStringUTF(options);  // 设置第二个元素为"start-system-server" 
  • env->SetObjectArrayElement(strArray, 1, optionsStr);   
  • // 将字符串"com.android.internal.os.ZygoteInit"转换为"com/android/internal/os/ZygoteInit"  char* slashClassName = toSlashClassName(className); 
  • jclass startClass = env->FindClass(slashClassName);  if (startClass == NULL) { 
  • ALOGE("JavaVM unable to locate class '%s'n", slashClassName);  } else { 
  • jmethodID startMeth = env->GetStaticMethodID(startClass, "main", "([Ljava/lang/String;)V");  if (startMeth == NULL) { 
  • ALOGE("JavaVM unable to find main() in '%sn'", className);  } else { 
  • // 3.  // 通过JNI调用java函数,注意调用的是main函数,所属的类是"com.android.internal.os.ZygoteInit". 
  • // 传递的参数是"com.android.internal.os.ZygoteInit true"  env->CallStaticVoidMethod(startClass, startMeth, strArray);