JVM-0x04-加载JVM

JVM启动的前置准备,加载JVM动态链接库,JVM启动涉及到的函数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
/**
* 从jvm的动态链接库中获取出3个启动JVM需要的函数 在进行JVM启动时机时直接调用加载出来的函数就行
* - JNI_CreateJavaVM
* - JNI_GetDefaultJavaVMInitArgs
* - JNI_GetCreatedJavaVMs
* @param jvmpath jvm路径 libjvm.dylib的全路径
* 即动态链接库文件 应该是jvm的实现被编译成了动态链接库 在运行时通过插件方式进行使用
* /jdk/build/macosx-x86_64-server-slowdebug/jdk/lib/server/lib/libjvm.dylib
* @param ifn 从动态链接库中获取指定的3个函数
* - JNI_CreateJavaVM
* - JNI_GetDefaultJavaVMInitArgs
* - JNI_GetCreatedJavaVMs
*/
jboolean
LoadJavaVM(const char *jvmpath, InvocationFunctions *ifn)
{
Dl_info dlinfo;
// 动态链接库打开后的句柄
void *libjvm;

JLI_TraceLauncher("JVM path is %s\n", jvmpath);

#ifndef STATIC_BUILD
libjvm = dlopen(jvmpath, RTLD_NOW + RTLD_GLOBAL); // 系统调用 打开动态链接库文件
#else
libjvm = dlopen(NULL, RTLD_FIRST);
#endif
if (libjvm == NULL) {
JLI_ReportErrorMessage(DLL_ERROR1, __LINE__);
// 通过dlerror显式获取动态链接库的操作失败的出错信息
JLI_ReportErrorMessage(DLL_ERROR2, jvmpath, dlerror());
return JNI_FALSE;
}

/**
* 获取JNI_CreateJavaVM函数
* 声明在jni.h中
* 实现在jni.cpp中
*/
ifn->CreateJavaVM = (CreateJavaVM_t)
dlsym(libjvm, "JNI_CreateJavaVM");
if (ifn->CreateJavaVM == NULL) {
JLI_ReportErrorMessage(DLL_ERROR2, jvmpath, dlerror());
return JNI_FALSE;
}

/**
* 获取JNI_GetDefaultJavaVMInitArgs函数
* 声明在jni.h中
* 实现在jni.cpp中
*/
ifn->GetDefaultJavaVMInitArgs = (GetDefaultJavaVMInitArgs_t)
dlsym(libjvm, "JNI_GetDefaultJavaVMInitArgs");
if (ifn->GetDefaultJavaVMInitArgs == NULL) {
JLI_ReportErrorMessage(DLL_ERROR2, jvmpath, dlerror());
return JNI_FALSE;
}

/**
* 获取JNI_GetCreatedJavaVMs函数
* 声明在jni.h中
* 实现在jni.cpp中
*/
ifn->GetCreatedJavaVMs = (GetCreatedJavaVMs_t)
dlsym(libjvm, "JNI_GetCreatedJavaVMs");
if (ifn->GetCreatedJavaVMs == NULL) {
JLI_ReportErrorMessage(DLL_ERROR2, jvmpath, dlerror());
return JNI_FALSE;
}

return JNI_TRUE;
}

JVM-0x04-加载JVM
https://bannirui.github.io/2023/05/04/JVM-0x04-加载JVM/
作者
dingrui
发布于
2023年5月4日
许可协议