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系统)
答案 0 :(得分:1)
如果我理解正确,您希望从一个OS进程(您的本机应用程序)调用到一个单独的OS进程(运行Java应用程序)。您无法在另一个进程中对JVM进行“直接”调用。您需要使用某种远程协议。两个“内置”选项是JMX(通过RMI)或直接RMI。或者,您可以在另一个JVM上公开Web服务,并使用标准HTTP交互来调用它。
答案 1 :(得分:1)
JNI函数只能在启动JVM的进程中使用。 JNI不允许您控制其他进程。
但是,有一种方法可以使用HotSpot Dynamic Attach API在不同JVM进程的上下文中加载代码。
在其上下文中有Java API附加到远程JVM和load代理库。但您也可以从我的jattach
项目中的本机代码中完成此操作。