通过 JNI 将本机应用程序附加到 Linux 上的 运行 个 JVM
Attach native application via JNI to already running JVM on Linux
A similar question 已经回答 Windows,但我无法找到如何在 Linux.
上实现相同的答案
我想加深对 JNI 的了解。我已经有 JNI 项目与 JNI_CreateJavaVM
一起工作,从本机应用程序中创建一个新的 JVM。
但这次我想 不 在本机应用程序中创建 JVM(即 不 使用 JNI_CreateJavaVM
),但要附加到已经 运行 的一个(即,使用 AttachCurrentThread
在某个 java myApplication
呼叫)。
有没有办法Linux如何实现这个?我需要获取 运行 JVM 的 JavaVM
对象。我尝试使用 JNI_GetCreatedJavaVMs
,但这不会 return 任何 JVM(我认为此方法仅 returns 当前进程创建的 VM,例如,通过使用 JNI_CreateJavaVM
,而不是系统上 运行 的所有虚拟机)
如果我理解正确,您想从一个 OS 进程(您的本机应用程序)调用另一个 OS 进程(运行 一个 java 应用程序).您不能在另一个进程中对 JVM 进行 "direct" 调用。您需要使用某种远程协议。两个 "builtin" 选项是 JMX(通过 RMI)或直接 RMI。或者,您可以在另一个 JVM 上公开 Web 服务并使用标准 HTTP 交互调用它。
JNI 函数只能在启动 JVM 的进程中使用。 JNI 不允许您控制其他进程。
但是,有一种方法可以使用 HotSpot Dynamic Attach 在不同 JVM 进程的上下文中加载代码 API。
- 将代码编译成代理库 (.so);
- 创建 Agent_OnAttach 函数作为代码的入口点;
- 使用动态附加加载代理库。
有Java API to attach to remote JVM and to load agent library in its context. But you can also do it from native code like in my jattach
个项目。
A similar question 已经回答 Windows,但我无法找到如何在 Linux.
上实现相同的答案我想加深对 JNI 的了解。我已经有 JNI 项目与 JNI_CreateJavaVM
一起工作,从本机应用程序中创建一个新的 JVM。
但这次我想 不 在本机应用程序中创建 JVM(即 不 使用 JNI_CreateJavaVM
),但要附加到已经 运行 的一个(即,使用 AttachCurrentThread
在某个 java myApplication
呼叫)。
有没有办法Linux如何实现这个?我需要获取 运行 JVM 的 JavaVM
对象。我尝试使用 JNI_GetCreatedJavaVMs
,但这不会 return 任何 JVM(我认为此方法仅 returns 当前进程创建的 VM,例如,通过使用 JNI_CreateJavaVM
,而不是系统上 运行 的所有虚拟机)
如果我理解正确,您想从一个 OS 进程(您的本机应用程序)调用另一个 OS 进程(运行 一个 java 应用程序).您不能在另一个进程中对 JVM 进行 "direct" 调用。您需要使用某种远程协议。两个 "builtin" 选项是 JMX(通过 RMI)或直接 RMI。或者,您可以在另一个 JVM 上公开 Web 服务并使用标准 HTTP 交互调用它。
JNI 函数只能在启动 JVM 的进程中使用。 JNI 不允许您控制其他进程。
但是,有一种方法可以使用 HotSpot Dynamic Attach 在不同 JVM 进程的上下文中加载代码 API。
- 将代码编译成代理库 (.so);
- 创建 Agent_OnAttach 函数作为代码的入口点;
- 使用动态附加加载代理库。
有Java API to attach to remote JVM and to load agent library in its context. But you can also do it from native code like in my jattach
个项目。