Java 通过JNI将本机应用程序连接到已经在Linux上运行的JVM
已经有人回答了Windows的问题,但我不知道如何在Linux上实现同样的问题 我想加深我在JNI方面的知识。我已经有了JNI项目,从本机应用程序中创建了一个新的JVM 但这次我不想在本机应用程序中创建JVM(即,不使用),而是连接到已经运行的JVM(即,在本机应用程序之前通过一些Java 通过JNI将本机应用程序连接到已经在Linux上运行的JVM,java,linux,jvm,java-native-interface,native,Java,Linux,Jvm,Java Native Interface,Native,已经有人回答了Windows的问题,但我不知道如何在Linux上实现同样的问题 我想加深我在JNI方面的知识。我已经有了JNI项目,从本机应用程序中创建了一个新的JVM 但这次我不想在本机应用程序中创建JVM(即,不使用),而是连接到已经运行的JVM(即,在本机应用程序之前通过一些javamyapplication调用启动的VM上使用) Linux上有没有办法实现这一点?我需要获取运行JVM的JavaVM对象。我尝试使用,但这不会返回任何JVM(我认为此方法只返回当前进程创建的VM,例如,通过使
javamyapplication
调用启动的VM上使用)
Linux上有没有办法实现这一点?我需要获取运行JVM的
JavaVM
对象。我尝试使用,但这不会返回任何JVM(我认为此方法只返回当前进程创建的VM,例如,通过使用,而不是系统上运行的所有VM)如果我理解正确,您希望从一个OS进程(您的本机应用程序)调用一个单独的OS进程(运行java应用程序)。不能在另一个进程中对JVM进行“直接”调用。你需要使用某种远程协议。两个“内置”选项是JMX(通过RMI)或直接RMI。或者,您可以在另一个JVM上公开Web服务,并使用标准HTTP交互调用它。JNI函数只能在启动JVM的进程中使用。JNI不允许您控制其他进程
但是,有一种方法可以使用HotSpot Dynamic Attach API在不同JVM进程的上下文中加载代码
- 将代码编译到代理库(.so)中李>
- 创建将作为代码入口点的函数李>
- 使用动态附加加载代理库
在远程JVM和其上下文中的代理库之间存在连接。但是,您也可以像在我的项目中那样从本机代码中执行此操作。当您创建JVM时,它将作为内存空间的一部分在当前进程中运行。你说的附加是什么意思?你期望这能做什么?@PeterLawrey:我现在稍微改变了这个问题,希望能让我的目标更清晰。我想要实现的是将(
AttachCurrentThread
)连接到一个已经运行的VM。我需要为此获取此VM的JavaVM
对象,但我不知道如何获取。您不能将线程从一个进程移动到另一个进程,也不能在进程之间共享线程。据我所知,没有任何操作系统会允许这种情况。所以我不清楚你希望做什么。您可以创建到现有进程的TCP连接并远程管理它,但这不是JNI,而是TCP。@PeterLawrey:例如,我希望能够从本机应用程序在已经运行的JVM中执行对某些(静态)方法的调用。我想我可以使用JNI实现这一点,通过使用JNI的GetStaticMethodID
&CallStaticIntMethod
,就像我以前在其他项目中所做的那样。唯一的区别是JVM这次已经在运行,而不是像在我以前的项目中那样使用JNI_CreateJavaVM
在本机应用程序中创建。基本上,使用“attach”,我的意思是我希望获得对已经运行的JVM的“JNI访问”(即检索其JNIEnv
和JavaVM
对象)Dynamic attach API是我昨天使用的方式,感谢您的回答!我一定会调查jattach!您还可以使用它作为jattach的包装器,然后可以从Java以编程方式附加