避免在JNI VM Startup

时间:2017-06-12 13:49:15

标签: c++ nullpointerexception jvm java-native-interface sigsegv

修改:  正如apangin在评论中指出的那样,假设,这是一个NPE是错误的。

我正在开发一个更大的项目,这使得必须使用从c ++代码调用的JVM。这是创建JVM的方法:

jvm_holder jvm_holder::create_jvm(std::vector<std::string> options) {

            /*
             * args args that produce the behaviour:
             *      {
             *          std::string("-Djava.class.path=./Assistant-0.1.0.jar"),
             *          std::string("-Xrs"),
             *          std::string("-XX:+UseAltSigs") <- this is not useful on linux, we know but we tried it anyways 
             *      };
             */

            if (nullptr != jvm){
                throw internal_exception("If you get this message during development, please read up on the usage of the JVM Holder!");
            }

            jvm_holder main_holder;

            JavaVMInitArgs vm_args;

            JavaVMOption *opt = new JavaVMOption[options.size()];
            for (int i = 0; i < options.size(); i++){
                opt[i].optionString = (char *) options[i].c_str();
            }
            vm_args.version = JNI_VERSION_1_8; 
            vm_args.nOptions = (int) options.size();
            vm_args.options = opt;
            vm_args.ignoreUnrecognized = JNI_FALSE;
            jint rc = JNI_CreateJavaVM(&jvm, (void **) &main_holder.env, &vm_args);
            delete opt;
            if (rc != JNI_OK) {
                jvm_exception("Can not start JVM.");
            }
            return main_holder;
        }

现在,每次执行此代码时(程序启动时只执行一次),在设置JVM期间会出现内部NullPointerException。这个NPE在JVM中处理,对于进程本身来说并不是什么大不了的事。

但是:进程组中的每个进程都获得一个SIGSEGV。我知道这是JVM检测NPE的常规机制。

现在,这种方法存在一些问题:

  1. 同一进程组中的另一个JVM也处理NPE。
  2. 每当我们其中一个人使用GDB时,该过程就会暂停,这真的很烦人。我们可以让GDB忽略这个信号,但我们认为这是一个坏主意,因为这意味着项目的任何其他部分都存在问题。
  3. 我们担心这会导致项目后期出现问题。
  4. 现在,我们没有弄清楚为什么会有这个NPE,但有可能关闭基于信号的NPE处理或避免导致这个启动问题吗?我无法想象,这从未打扰过任何人,因为这是我们第三次在短短几个月内遇到问题,而这次,我们不能简单地停止使用JNI。

    祝你好运

0 个答案:

没有答案