Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.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
我可以存储JNIJavaEnv变量吗?_Java_Java Native Interface - Fatal编程技术网

我可以存储JNIJavaEnv变量吗?

我可以存储JNIJavaEnv变量吗?,java,java-native-interface,Java,Java Native Interface,我正在制作一个lib,以便cpp应用程序可以与JVM通信。假设JVM已经启动,如何使cpp二进制文件与JVM通信?我认为最好的解决方案是将JNI env变量存储在共享对象(so)中,这样我就可以将它包含在cpp中并在以后使用 可能吗 编辑---- 我希望在JVM之外获得JavaVM接口,类似于以下方法: GetJavaVM返回当前虚拟机实例的JavaVM接口指针 不,我不这么认为。JVM在启动时获得环境,并且在程序运行时不能从外部进程更改环境 现在的标准程序是让程序使用TCP/IP和套接字进行

我正在制作一个lib,以便cpp应用程序可以与JVM通信。假设JVM已经启动,如何使cpp二进制文件与JVM通信?我认为最好的解决方案是将JNI env变量存储在共享对象(so)中,这样我就可以将它包含在cpp中并在以后使用

可能吗

编辑----

我希望在JVM之外获得JavaVM接口,类似于以下方法:

  • GetJavaVM返回当前虚拟机实例的JavaVM接口指针
    不,我不这么认为。JVM在启动时获得环境,并且在程序运行时不能从外部进程更改环境

    现在的标准程序是让程序使用TCP/IP和套接字进行通信。对于一个简单且廉价的解决方案,您可以考虑在目录中使用文件(当然,当然还有性能和并发问题)。
    我刚刚注意到“我正在做一个自由”的陈述。如果您的lib是用于“公共”消费的,那么它应该是跨平台的,然后我认为socket I/O将是应该做的事情


    <>你可能会劫持你所要求的,但是我对它不太了解。

    你的问题不清楚:听起来你想用C++应用程序与一个独立的进程运行的JVM通信。在这种情况下,您需要使用某种形式的进程间通信,例如管道、套接字、CORBA等等。与所有指针一样,JNIEnv指针只在使用它的进程内有效


    我认为适合您的问题的唯一情况是,如果您启动一个Java程序,调用一个本机方法,那么该本机方法将启动单独的线程。在这种情况下,不可以共享JNIEnv指针,因为它绑定到线程。但是,你可以使用C++从你的C++线程访问java VM。

    你这里有多少个进程?如果这都在一个过程中,那么答案是“是”。C++可以从JNI .H.< /P>调用GETEnVAPI,这是我想要的,我有2个进程,一个JVM带有一个本地的LIB,它将存储指针,另一个只有C++代码,使用这个LIB。我希望另一个进程(仅限C++)使用该库并调用jvm(其他进程)。我认为可以在本机库中创建一个方法“connect”,以执行以下操作:*使用GetJavaVM()返回JavaVM指针,现在使用该JavaVM指针调用AttachCurrentThread()。我的问题是这是否可能,因为它们不是由线程而是由进程分隔的:(请重新阅读我的答案,以及其他所有回答的人的答案。如果你仍然相信这是可能的,那么请阅读一本关于操作系统实现的书。如果在这个过程中你遇到了“共享内存”的引用)并认为它能解决你的问题:不,它不会。所以最好的方法是进行进程间通信,?(时间:在java中创建一个可以从C++中讲出来的Web服务?)