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.exe,或 javaw.exe,或 iexplore.exe).一种常见的注入(inject)技术是使用 SetWindowsHookEx

2) 在 DLL 中,使用 GetModuleHandle

获取 jvm.dll 的模块句柄

3) 使用 GetProcAddress

获取 JNI_GetCreatedJavaVMs 函数的地址

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

5) 完成。

有用链接:The Invocation API

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

相关文章:

java - 如何替换某个角色的某个实例

java - org.apache.poi.poifs.filesystem.OfficeXmlFileException

android - 捕获图像而不保存

c++ - QML:如何使用日期函数

java - 一个类拥有另一个类的实例时,JVM 初始化顺序是什么

java - Eclipse Oxygen无法创建虚拟机

java - 更改 WAS 7 上特定 Web 应用程序的 System.out.println 输出目标

Java 数据库显示国家数据库表中的所有国家信息

c++ - 用带有 int 标识符的类替换枚举 - 不编译

java - 如何正确管理 Kubernetes 中的 Java Spring 应用程序自动缩放?