java - 附加到已经运行的 JVM

标签 java c++ jvm java-native-interface

有没有办法附加到已经运行的 JVM?

例如,在 JNI 中,您可以使用 JNI_CreateJavaVM 创建 VM 并运行 jar 并检查其所有类..

但是,如果 jar 已经在运行,我无法找到附加到其 JVM 并与其类进行通信或获取其 env 指针的方法..

另一个问题是,如果 jar 加载了我的 native 库 (.dll) 并且我想在 .dll 中创建一个 JVM,我不能......我也不能在没有 jar 调用我的函数的情况下附加 jar 的当前 JVM。 .

Java 端的示例:

class Foo
{
    static {loadLibrary("Foo")}
}

在 C++ 方面:

void Foo()
{
    //CreateJVM
    //Attach to the current process..
    //Call function from the jar that loaded me.
}

如果 jar 不先调用 Foo,则无法做到这一点。

有什么想法吗?有没有办法获取当前的 JVM 或附加到它或外部的 jvm 实例?

最佳答案

是的,你可以。

1) 在托管 JVM 的进程中注入(inject) DLL(例如,java.exejavaw.exe >iexplore.exe)。一种常见的注入(inject)技术是使用 SetWindowsHookEx

2)在DLL中,使用GetModuleHandle

获取jvm.dll的模块句柄

3) 获取JNI_GetCreatedJavaVMs函数的地址,使用GetProcAddress

4) 调用函数,如果成功,则使用 JavaVM 中的 AttachCurrentThread 函数指针将线程附加到找到的第一个 JVM > 结构。

5) 完成。

有用的链接:The Invocation API

关于java - 附加到已经运行的 JVM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22441878/

相关文章:

c++ - 对派生类C++使用不同的基本构造函数

c# - C++ DLL LPCTSTR 到 C# 字符串

java - classloader如何加载和卸载静态类?

java - 你能在没有操作系统的计算机上运行 JVM 吗?

java - Camel java dsl将bean方法返回值传递给标题

java - 当页面中存在两个框架时如何移动物理鼠标

c++ - 我如何输出2D数组的行总和C++

java - IntelliJ/Maven repo 问题

java - 向 exec-maven-plugin 添加附加路径

Java G1GC - 卡片表(CT)与 memset (RS)