在C++程序里调用"JNI_CreateJavaVM"函数是不是只能创建一个虚拟机?
因为我第二次调用"JNI_CreateJavaVM"时它返回-1。我看了sun的文档,里面说并不是所有厂商的Java虚拟机都可以在同一个进程中创建多个,但是连sun自家的都不行吗?

解决方案 »

  1.   

    不可以,但我也不知道为什么。而且好像没有那个必要创建2个虚拟机。就像加载
    2次jvm.dll一样没用。
      

  2.   

    Windows上好像确实不行。
    也许Unix/Linux下可以。但是确实没有必要这么做。
      

  3.   

    en, 我在 Sun 的文档里没有看到明确说“不行”的地方,感觉应该是行的~~至于楼上兄弟说的“必要性”,我觉得有些情况下还是需要的,比如为了隔离。楼主是在同一个线程中调用 JNI_CreateJavaVM() 的吗?如果是的话,不妨试试在*不同*的线程中调用。
      

  4.   

    我还真没试过创建两个JVM,一个倒是做过,真要回家试试看。
      

  5.   

    maquan('ma:kju) 
    我是在两个线程分别调用"JNI_CreateJavaVM"的,而且调用的时间也不同。
      

  6.   

    在不同的操作系统中的线程,进程的概念是存在差别的。
    Win32上java.exe就是一个虚拟机,是一个进程。里面可能有多个ClassLoader加载多个App。
      

  7.   

    查了一下 JDK 的 source code(我用的是 jdk-1_5_0-src-scsl),在 jni.cpp 里看到这样一段,hehe~~_JNI_IMPORT_OR_EXPORT_ jint JNICALL JNI_CreateJavaVM(JavaVM **vm, void **penv, void *args) {
      // At the moment it's only possible to have one Java VM, 
      // since some of the runtime state is in global variables.   // We cannot use our mutex locks here, since they only work on
      // Threads. We do an atomic compare and exchange to ensure only
      // one thread can call this method at a time
      if (Atomic::add(1, &num_vm_created) > 1) {
        return JNI_ERR;
      }
      if (Atomic::xchg(1, &vm_created) == 1) {
        Atomic::dec(&num_vm_created);
        return JNI_ERR;
      }  assert(vm_created == 1, "vm_created is true during the creation");
      ……
      

  8.   

    maquan('ma:kju)
    意思是说只能创建一个jvm了...
      

  9.   

    看来就是只能创建一个 JVM 了,既然 Sun 的 JDK 就是这么做的~~我也写了个 C 程序试过了,没什么新发现  :(