已经为
Windows回答了
A similar question,但我无法找到如何在Linux上实现相同的功能.
我想加深对JNI的了解.我已经让JNI项目与JNI_CreateJavaVM
一起工作,从本机应用程序中创建一个新的JVM.
但是这次我想不在本机应用程序中创建JVM(即,不使用JNI_CreateJavaVM
),而是附加到已经运行的JVM(即,在某些java本机应用程序之前启动的VM上使用AttachCurrentThread
) myApplication调用).
有没有办法在Linux上如何实现这一目标?我需要获取正在运行的JVM的JavaVM对象.我尝试使用JNI_GetCreatedJavaVMs
,但这不会返回任何JVM(我认为此方法仅返回当前进程创建的VM,例如,使用JNI_CreateJavaVM
,而不是所有在系统上运行的VM)
最佳答案 JNI函数只能在启动JVM的进程中使用. JNI不允许您控制其他进程.
但是,有一种方法可以使用HotSpot Dynamic Attach API在不同JVM进程的上下文中加载代码.
>将代码编译到代理库(.so);
>创建Agent_OnAttach函数,该函数将成为代码的入口点;
>使用动态附加加载代理库.