gpt4 book ai didi

java - 附加到已经运行的 JVM

转载 作者:可可西里 更新时间:2023-11-01 18:16:01 26 4
gpt4 key购买 nike

有没有办法附加到已经运行的 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com