Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 通过JNI将本机应用程序连接到已经在Linux上运行的JVM_Java_Linux_Jvm_Java Native Interface_Native - Fatal编程技术网

Java 通过JNI将本机应用程序连接到已经在Linux上运行的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,例如,通过使

已经有人回答了Windows的问题,但我不知道如何在Linux上实现同样的问题

我想加深我在JNI方面的知识。我已经有了JNI项目,从本机应用程序中创建了一个新的JVM

但这次我不想在本机应用程序中创建JVM(即,不使用),而是连接到已经运行的JVM(即,在本机应用程序之前通过一些
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以编程方式附加