连接到已经运行的JVM
Attach to already running 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)获取JNI_GetCreatedJavaVMs
函数的地址,使用GetProcAddress
4)调用该函数,如果成功,使用JavaVM
结构体中的AttachCurrentThread
函数指针将您的线程附加到找到的第一个JVM上。
5) 。
有用的链接:调用API
不行。JNI只允许两种模型:
- 你的非java程序创建JVM。
- Java程序调用一个本机方法。
如果您需要在其他情况下进行通信,则需要使用其他机制。Web服务是一种简单的方法。
相关文章:
- 运行同一解决方案的另一个项目的项目
- CMake-按正确顺序将项目与C运行时对象文件链接
- 如何运行位于boost/libs/python/example/tutorial目录中的hello.cpp和Jamfil
- 代码在main()中运行,但在函数中出现错误
- 我在c++代码中生成了一个运行时#3异常
- 如何在linux终端中同时编译和运行c++代码
- 为什么在运行时没有向我们提供有关分段错误的更多信息?
- 如何在运行中期切换GTK CSS style_context
- 如何在MS Visual Studio 2019中运行QT UI
- 如何通过cpp程序运行shell脚本
- IPC使用多个管道和分支进程来运行Python程序
- 删除指向指针的指针是运行时错误吗
- 如何用参数值调用函数(仅在运行时已知)
- 为什么即使使用-cudart-static进行编译,库用户仍然需要链接到cuda运行时
- 如何在C++(JNI)中设置正在运行的JVM的类路径
- 注入 jar 并替换正在运行的 JVM 中的类
- C 在运行的JVM中调用功能
- JNI:从 JVM 到 C++ 的回调无法运行
- 从C++代码运行JVM并设置类路径
- 连接到已经运行的JVM