You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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程序。当前预期流程(暂未实现):

  1. 启动JVM并加载代理;
  2. JVM调用上述Agent_OnLoad(JavaVM*, ...)方法;
  3. agentOnLoad函数将布尔变量initialized设为true;
  4. Qt程序读取该布尔变量值;
  5. Qt程序展示更新后的变量值。

已知跨进程无法通过DLL共享变量,现咨询在Windows平台下实现该需求的可行方案。

内容的提问来源于stack exchange,提问作者VJZ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 02:20:33