Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 附加到已经运行的JVM_Java_C++_Jvm_Java Native Interface - Fatal编程技术网

Java 附加到已经运行的JVM

Java 附加到已经运行的JVM,java,c++,jvm,java-native-interface,Java,C++,Jvm,Java Native Interface,有没有办法连接到已经运行的JVM 例如,在JNI中,您可以使用JNI\u CreateJavaVM创建VM,运行jar并检查其所有类 但是,如果jar已经在运行,我就找不到方法连接到它的JVM并与它的类通信,或者获取它的env指针 另一个问题是,如果jar加载了我的本机库(.dll),并且我想在.dll中创建一个JVM,那么我就不能。。如果jar不调用我的函数,我也不能附加jar的当前JVM Java方面的示例: class Foo { static {loadLibrary("Foo"

有没有办法连接到已经运行的JVM

例如,在JNI中,您可以使用
JNI\u 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或外部JVM实例吗?

没有办法。JNI只允许两种型号:

  • 非Java程序创建JVM
  • Java程序调用本机方法
如果您需要在其他情况下进行通信,则需要使用其他机制。Web服务是一种简单的方法。

是的,您可以

1)在承载JVM的进程中插入DLL(例如,
java.exe
,或
javaw.exe
,或
iexplore.exe
)。常用的注射技术是使用

2)在DLL中,使用
GetModuleHandle

3)使用
GetProcAddress

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

5)完成


有用链接:

这是针对windows、linux还是其他操作系统的?您使用的是哪个C调试器/IDE?我可能缺少smth,但您不能打开调试端口并连接到它吗?在调试器中,点击pause VM并期待一切?我正在使用代码块,我在Windows上。我不知道你打开调试器并点击暂停是什么意思。@CantChooseUsernames如果你使用了我的答案,请告诉我。您可以在运行的java进程中注入动态链接库,并连接到JVM。看看我的答案。在窗户上很好用。是的!这是有效的:D我没有使用
SetWindowsHook
。相反,我只是使用
CreateThread
LoadLibrary
组合进行注入。尽管如此,它还是有效的我很高兴@CantChooseServerNames快乐编码!(注意JNI内存泄漏:-)@CantChooseServerNames侧注:使用
SetWindowsHookEx
,您可以选择连接到“GUI”线程。这可能很重要。