jni_CreateJavaVm详解

本文详细介绍了JNI_VM创建过程中的关键步骤,从确保唯一性到初始化各组件,再到加载核心类,直至启动辅助线程,全面揭示了HotSpot虚拟机启动的内部机制。

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

jni_CreateJavaVm详解
   1.确保只有一个线程调用这个方法并且确保只创建一个hotspot vm 实例。因为hotspot vm
   创建的静态数据结构无法再次初始化,所以一旦初始化到某个确定点后,进程空里只能有一
   个hotspot vm。
   2.检查并确保支持当前的jni版本,初始化垃圾收集日志的输出流。
   3.初始化os模块,如当前进程id、内存页尺寸,
   4.解析传入jni——createJavavm的命令选项,保存以备将来使用
   5.初始化标准的java系统属性。
   6.支持同步栈、内存和安全点页的模块
   7.加载libzip、libhpi、及libthread等库
   8.初始化并设置信号管理器
   9.初始化线程库
   10.初始化输出流日志记录器
   11.如果使用agent库,则初始化并启动
   12初始化线程状态和线程本地存储,他们储存线程私有数据
   13初始化部分hotspot全局数据,如事件日志,os同步语言
   14至此,vm可以创建线程可。创建出来的java版main线程被关联到当前操作系统的线程,只不
   过还没添加到已有的线程列表上
   15初始化并激活java级别的同步
   16初始化启动类加载器、代码缓存、解释器、jit编译器、系统字典、
   17.现在添加java主线程到以知线程列表中。检查universe(一种必备的全局数据结构)是否正
   常。创建vmthread,执行vm所有关键的功能。同时发出jvmti事件,报告Hotspotvm的当前
   状态。
   18.加载和初始化以下java类:java.lang.String等系统类。
   19.启动hotspotvm的信号处理器线程,初始化jit编译器并启动编译代理线程。启动vm辅助线程
### JNI_CreateJavaVM 的用法与配置 #### 背景说明 `JNI_CreateJavaVM` 是 Java Native Interface (JNI) 提供的一个函数,用于初始化一个新的 Java 虚拟机实例。该函数通常由 C/C++ 应用来调用,以便嵌入式运行 Java 程序。 在 Windows 平台上使用 Visual Studio 2022 配置 `JNI_CreateJavaVM` 函数时,需要注意以下几个方面: --- #### 1. JDK 安装与环境变量设置 为了成功调用 `JNI_CreateJavaVM`,需要确保已安装合适的 JDK 版本,并将其路径正确配置到系统的环境变量中。具体来说: - 将 `%JAVA_HOME%\bin` 和 `%JAVA_HOME%\lib` 添加到系统 PATH 变量中。 - 确认 `libjvm.dll` 文件存在于 `%JAVA_HOME%\bin\server` 或其他子目录下[^1]。 如果缺少上述 DLL 文件,则会引发错误提示:“未定义的引用‘JNI_CreateJavaVM’”。 --- #### 2. 配置项目属性 在 Visual Studio 2022 中开发支持 JNI 的应用程序时,需完成以下步骤来链接必要的库文件和头文件: - **包含路径**: 在项目的“属性 -> C/C++ -> 常规 -> 附加包含目录”中添加 JDK 的 include 目录及其平台特定子目录。例如: ``` %JAVA_HOME%\include %JAVA_HOME%\include\win32 ``` - **库依赖项**: 在“属性 -> 链接器 -> 输入 -> 附加依赖项”中指定所需的动态链接库名称(无需扩展名)。对于 Windows,默认情况下不需要显式链接静态库,因为 `libjvm.dll` 已经包含了所需的功能实现[^3]。 --- #### 3. 初始化 Java VM 示例代码 以下是通过 `JNI_CreateJavaVM` 创建并启动 Java 虚拟机的一段典型代码示例: ```cpp #include <jni.h> #include <iostream> int main() { JNIEnv* env; JavaVM* jvm; JavaVMInitArgs vm_args; // 设置 JVM 参数 memset(&vm_args, 0, sizeof(vm_args)); vm_args.version = JNI_VERSION_1_8; // 使用 JDK 8 标准版本 vm_args.nOptions = 0; vm_args.ignoreUnrecognized = false; jint res = JNI_CreateJavaVM(&jvm, reinterpret_cast<void**>(&env), &vm_args); if (res != JNI_OK || !env) { // 如果失败则退出程序 std::cerr << "Failed to create JVM." << std::endl; return -1; } // 执行一些操作... std::cout << "JVM created successfully!" << std::endl; // 关闭虚拟机 jvm->DestroyJavaVM(); return 0; } ``` 此代码片段展示了如何利用 `JNI_CreateJavaVM` 来创建一个简单的 Java 虚拟机实例。 --- #### 4. 解决常见问题 当遇到类似于“The JVM shared library ‘…’ does not contain the JNI_CreateJavaVM symbol”的错误消息时,可以尝试以下方法排查问题: - 检查所使用的 JDK 是否兼容当前操作系统架构(如 x64 vs x86)。 - 确保加载的是正确的共享库文件 (`libjvm.so` 对于 Linux/MacOS;`libjvm.dll` 对于 Windows)[^2]。 - 更新至最新版 JDK,某些旧版本可能不完全支持最新的 API 接口标准。 --- ####
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值