连接到已经运行的JVM
有没有办法连接到已经运行的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)使用GetProcAddress
获取JNI_GetCreatedJavaVMs
函数的地址
4)调用函数,如果成功,则使用JavaVM
结构中的AttachCurrentThread
函数指针将线程附加到找到的第一个JVM。
5)完成。
有用链接: Invocation API
你不能。 JNI只允许两种型号:
- 您的非Java程序会创建JVM。
- Java程序调用本机方法。
如果您需要在其他情况下进行通信,则需要使用其他一些机制。 Web服务是一种简单的方法。