我可以存储JNI Java Env变量吗?

时间:2010-01-04 13:13:04

标签: java java-native-interface

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

这可能吗?

编辑----

我想在JVM之外获取JavaVM接口,类似于这个方法:

  • GetJavaVM返回当前虚拟机实例的JavaVM接口指针。

3 个答案:

答案 0 :(得分:2)

您的问题不明确:听起来您希望C ++应用程序与作为单独进程运行的JVM进行通信。在这种情况下,您需要使用某种形式的进程间通信,如管道,套接字,CORBA等等。与所有指针一样,JNIEnv指针仅在其使用过程中有效。

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

答案 1 :(得分:0)

不,我不这么认为。 JVM在启动时获取环境,并且在程序运行期间无法从外部进程更改。

目前的标准程序是程序使用TCP / IP和套接字进行通信。对于一个简单而廉价的解决方案,您可以考虑在目录中使用文件(当然,这会有性能和并发问题)。


我刚注意到“我正在制作一个lib”声明。如果你的lib用于“公共”消费,它应该是跨平台的,然后我认为套接字I / O将是要做的事情。

你可能会劫持JMX去做你所要求的事情,但我对此并不是很了解。

答案 2 :(得分:0)

你在这里有多少个进程?如果这一切都在一个过程中,则答案为“是”。 C ++可以从jni.h调用GetEnv API。