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

Mar*_*ger 5 java linux java-native-interface jvm native

Windows 上已经回答了类似的问题,但我不知道如何在 Linux 上实现相同的目标。

我想加深对JNI的了解。我已经开始使用 JNI 项目JNI_CreateJavaVM,从本机应用程序中创建一个新的 JVM。

但这次我不想在本机应用程序中创建JVM(即使用JNI_CreateJavaVM),而是附加到已经运行的应用程序(即在AttachCurrentThread通过某种调用在本机应用程序之前启动的 VM 上使用java myApplication)。

Linux 上有没有办法实现这一点?我需要获取JavaVM正在运行的 JVM 的对象。我尝试使用JNI_GetCreatedJavaVMs,但这不会返回任何 JVM(我认为此方法仅返回当前进程创建的虚拟机,例如,通过使用JNI_CreateJavaVM,而不是系统上运行的所有虚拟机)

apa*_*gin 1

JNI 函数只能在启动 JVM 的进程中使用。JNI 不允许您控制其他进程。

但是,有一种方法可以使用 HotSpot Dynamic Attach API 在不同 JVM 进程的上下文中加载代码。

  • 将您的代码编译到代理库(.so)中;
  • 创建Agent_OnAttach函数,该函数将作为代码的入口点;
  • 使用动态附加加载代理库。

Java API可附加到远程 JVM 并在其上下文中加载代理库。但您也可以通过本机代码来完成此操作,就像在我的jattach项目中一样。