android启动本地服务,Android本地服务的启动

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

// 根据上面的解释可知:准备启动Java VM,并且创建VM的主线程,只要VM不退出,这个主线程一直运行。

jclass startClass;

jmethodID startMeth;

for (cp = slashClassName; *cp != '\0'; cp++) //

将com.android.internal.os.ZygoteInit中的包分隔符‘.’换成‘/’即:com/android/internal/os/ZygoteInit

if (*cp == '.')

*cp = '/';

startClass = env->FindClass(slashClassName); // 从VM中查找ZygoteInit类,难道它要在VM里加载这个类。。。。

if (startClass == NULL) {

LOGE("JavaVM unable to locate class '%s'\n", slashClassName);

/* keep going */

} else {

startMeth = env->GetStaticMethodID(startClass, "main",

"([Ljava/lang/String;)V"); //

查找到com/android/internal/os/ZygoteInit类中的main方法ID,接合Java文件命名规则,你能更深刻的理解,为什么主类名要和文件名一致,并且main方法为static方法。

if (startMeth == NULL) {

LOGE("JavaVM unable to find main() in '%s'\n", className);

/* keep going */

} else {

env->CallStaticVoidMethod(startClass, startMeth, strArray); // 调用ZygoteInit类里的main方法,这不是运行ZygoteInit这个JAVA程序吗!!

#if 0

if (env->ExceptionCheck())

threadExitUncaughtException(env);

#endif

}

}

LOGD("Shutting down VM\n");

if (mJavaVM->DetachCurrentThread() != JNI_OK)

LOGW("Warning: unable to detach main thread\n");

if (mJavaVM->DestroyJavaVM() != 0)

LOGW("Warning: VM did not shut down cleanly\n");

bail:

free(slashClassName);

}

由上面的分析可知,AndroidRuntime::start方法实现了下面功能:

1> 通过startVm来启动虚拟机,并且注册了一些系统JNI函数,由于这个时候VM里还没有程序,只是个空的VM执行环境

2> 通过AndroidRuntime::start的参数,在JNI代码里构建第一个Java程序ZygoteInit,将其作为VM的主线程,同时给其传递两个JNI构建的参数:

"com/android/internal/os/ZygoteInit"和"true"

总结:

Android系统的启动是由init进程加载并启动了里面的/system/bin/app_process程序作为zygote服务,然后在zygote服务里执行runtime.start启动Dalvik虚拟机,加载了ZygoteInit类作为Dalvik虚拟机的第一个主线程。至此,Android的Java运行环境就准备完毕了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值