Windows下JVMTI代理DLL与Qt调试GUI进程间数据传递方案咨询
Windows平台下JVMTI代理与Qt GUI跨进程通信的可行方案
我计划用C通过Java Virtual Machine Tool Interface(JVMTI)为JVM开发原生代理,同时用C Qt开发一款GUI可执行程序,用于展示JVM内部运行状态。已在Visual Studio中搭建两个项目:
- JVMTI代理DLL项目
- Qt EXE GUI项目
在Qt项目中引入了该DLL以实现GUI与JVM的通信,但了解到DLL无法跨进程共享变量,现有代码无法正常工作。以下是相关代码上下文:
代理DLL源码
#include "pch.h" #include "../include/jvmagent.h" JNIEXPORT jint JNICALL Agent_OnLoad(JavaVM* vm, char* options, void* reserved) { JVMAgent::agentOnLoad(vm); return JNI_OK; } __declspec(dllexport) long JVMAgent::agentOnLoad(JavaVM* vm) { JVMAgent::initialized = true; return JNI_OK; }
代理头文件
#pragma once #ifndef DLLAGENT_H #define DLLAGENT_H #include "../src/pch.h" namespace JVMAgent { #pragma data_seg("SHARED") inline bool initialized = false; #pragma data_seg() #pragma comment(linker, "/section:SHARED,RWS") __declspec(dllexport) long agentOnLoad(JavaVM* vm); } #endif // DLLAGENT_H
Qt GUI代码
#include "stdafx.h" #include "debugvisualizer.h" #include "jvmagent.h" DebugVisualizer::DebugVisualizer(QWidget *parent) : QMainWindow(parent) { ui.setupUi(this); connect(ui.pushButton, SIGNAL(clicked(bool)), SLOT(onButtonPressed())); } void DebugVisualizer::onButtonPressed() { ui.textBrowser->setText(QVariant(JVMAgent::initialized).toString()); }
我尝试过共享内存方案但未成功,最终目标是将JVM的各类函数与数据传递至Qt程序。当前预期流程(暂未实现):
- 启动JVM并加载代理;
- JVM调用上述
Agent_OnLoad(JavaVM*, ...)方法; - agentOnLoad函数将布尔变量
initialized设为true; - Qt程序读取该布尔变量值;
- Qt程序展示更新后的变量值。
已知跨进程无法通过DLL共享变量,现咨询在Windows平台下实现该需求的可行方案。
内容的提问来源于stack exchange,提问作者VJZ
相关产品推荐
相关产品推荐

