连接到已经运行的JVM

Attach to already running JVM

本文关键字:JVM 运行 连接      更新时间:2023-10-16

是否有办法连接到已经运行的JVM?

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

但是,如果jar已经在运行,我找不到一种方法来连接到它的JVM并与它的类通信或获得它的env指针。

另一个问题是,如果jar加载我的本机库(.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的进程中注入DLL(例如,java.exe,或javaw.exe,或iexplore.exe)。一个常见的注入技术是使用SetWindowsHookEx

2)在DLL中,使用GetModuleHandle

获取jvm.dll的模块句柄

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

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

5)

有用的链接:调用API

不行。JNI只允许两种模型:

  • 你的非java程序创建JVM。
  • Java程序调用一个本机方法。

如果您需要在其他情况下进行通信,则需要使用其他机制。Web服务是一种简单的方法。