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

时间:2016-07-26 11:26:35

标签: java linux jvm java-native-interface native

Windows已经解答了

A similar question,但我无法了解如何在Linux上实现相同目标。

我想加深对JNI的了解。我已经让JNI项目与JNI_CreateJavaVM一起工作,从本机应用程序中创建一个新的JVM。

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

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

2 个答案:

答案 0 :(得分:1)

如果我理解正确,您希望从一个OS进程(您的本机应用程序)调用到一个单独的OS进程(运行Java应用程序)。您无法在另一个进程中对JVM进行“直接”调用。您需要使用某种远程协议。两个“内置”选项是JMX(通过RMI)或直接RMI。或者,您可以在另一个JVM上公开Web服务,并使用标准HTTP交互来调用它。

答案 1 :(得分:1)

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

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

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

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