连接到已经运行的JVM

时间:2014-03-16 19:38:05

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

有没有办法连接到已经运行的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.
}

如果没有首先调用Foo的jar,就无法做到这一点。

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

2 个答案:

答案 0 :(得分:15)

是的,你可以。

1)在托管JVM的进程中注入DLL(例如java.exejavaw.exeiexplore.exe)。常见的注射技术是使用SetWindowsHookEx

2)在DLL中,使用jvm.dll

获取GetModuleHandle的模块句柄

3)使用JNI_GetCreatedJavaVMs

获取GetProcAddress函数的地址

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

5)完成。

有用链接:The Invocation API

答案 1 :(得分:1)

不,你不能。 JNI允许两种模型:

  • 您的非Java程序会创建JVM。
  • 您Java程序调用本机方法。

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