修改: 正如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的常规机制。
现在,这种方法存在一些问题:
现在,我们没有弄清楚为什么会有这个NPE,但有可能关闭基于信号的NPE处理或避免导致这个启动问题吗?我无法想象,这从未打扰过任何人,因为这是我们第三次在短短几个月内遇到问题,而这次,我们不能简单地停止使用JNI。
祝你好运