java – 通过JNI将本机应用程序附加到Linux上已经运行的JVM

已经为
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函数,该函数将成为代码的入口点;
>使用动态附加加载代理库.

在上下文中有Java API附加到远程JVM和load代理库.但你也可以从我的jattach项目中的本机代码中完成.

点赞