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