《jdk8u源码分析》16.2.9.PostJVMInit

该博客围绕JDK8u进行源码分析,涉及不同操作系统下的特定源码文件及函数,如linux的src/solaris/bin/java_md_solinux.c中的PostJVMInit函数、windows的src/windows/bin/java_md.c中的PostJVMInit函数,还有mac下相关文件的对应函数及SetMainClassForAWT函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

src/solaris/bin/java_md_solinux.c::PostJVMInit (linux)

void
PostJVMInit(JNIEnv *env, jstring mainClass, JavaVM *vm)
{
    // stubbed out for windows and *nixes.
}

src/windows/bin/java_md.c::PostJVMInit (windows)

void
PostJVMInit(JNIEnv *env, jstring mainClass, JavaVM *vm)
{
    // stubbed out for windows and *nixes.
}

src/macosx/bin/java_md_macosx.c::PostJVMInit (mac)

/*
 * Note the jvmInstance must be initialized first before entering into
 * ShowSplashScreen, as there is a callback into the JLI_GetJavaVMInstance.
 */
void PostJVMInit(JNIEnv *env, jstring mainClass, JavaVM *vm) {
    jvmInstance = vm;
    SetMainClassForAWT(env, mainClass);
    //@see 16.JVMInit
    ShowSplashScreen();
}

src/macosx/bin/java_md_macosx.c::SetMainClassForAWT

static void
SetMainClassForAWT(JNIEnv *env, jclass mainClass) {
    jclass classClass = NULL;
    //@see:16.2.3.ShowSettings
    NULL_CHECK(classClass = FindBootStrapClass(env, "java/lang/Class"));

    jmethodID getCanonicalNameMID = NULL;
    NULL_CHECK(getCanonicalNameMID = (*env)->GetMethodID(env, classClass, "getCanonicalName", "()Ljava/lang/String;"));

    jstring mainClassString = NULL;
	//调用java.lang.Class::getCanonicalName
	//getName与getCanonicalName只在数组和内部类时有区别,getCanonicalName更容易理解
	//						getName				getCanonicalName		getSimpleName
	//	String []		[Ljava.lang.String;		java.lang.String[]		String[]
	//	InnerClass		OuterClass$InnerClass	OuterClass.InnerClass	InnerClass
    NULL_CHECK(mainClassString = (*env)->CallObjectMethod(env, mainClass, getCanonicalNameMID));

    const char *mainClassName = NULL;
    //将主类由字符串形式转换为UTF字符数组
    NULL_CHECK(mainClassName = (*env)->GetStringUTFChars(env, mainClassString, NULL));

    char envVar[80];
    /*
     * The JAVA_MAIN_CLASS_<pid> environment variable is used to pass
     * the name of a Java class whose main() method is invoked by
     * the Java launcher code to start the application, to the AWT code
     * in order to assign the name to the Apple menu bar when the app
     * is active on the Mac.
     * The _<pid> part is added to avoid collisions with child processes.
     *
     * WARNING: This environment variable is an implementation detail and
     * isn't meant for use outside of the core platform. The mechanism for
     * passing this information from Java launcher to other modules may
     * change drastically between update release, and it may even be
     * removed or replaced with another mechanism.
     *
     * NOTE: It is used by SWT, and JavaFX.
     */
    //设置环境变量:JAVA_MAIN_CLASS_${PID}=主类::CanonicalName::UTF数组
    snprintf(envVar, sizeof(envVar), "JAVA_MAIN_CLASS_%d", getpid());
    setenv(envVar, mainClassName, 1);
	
	//释放存储主类字符串和字符数组内存
    (*env)->ReleaseStringUTFChars(env, mainClassString, mainClassName);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值