--- mp-7fd4828c934fccf7367499c9e01cc9a1e90a2093/solvers/jacop/java.cc.orig 2020-03-03 23:39:58.000000000 -0700 +++ mp-7fd4828c934fccf7367499c9e01cc9a1e90a2093/solvers/jacop/java.cc 2021-01-15 14:48:04.231938853 -0700 @@ -119,7 +119,7 @@ std::string RegKey::GetStrValue(fmt::CSt namespace mp { -JVM JVM::instance_; +JVM *JVM::instance_; void Env::Throw(jthrowable exception, const char *method_name) { env_->ExceptionClear(); @@ -190,8 +190,16 @@ JVM::~JVM() { jvm_->DestroyJavaVM(); } +void JVM::cleanup_jvm() +{ + if (instance_) { + delete instance_; + instance_ = nullptr; + } +} + Env JVM::env(const char *const *options) { - if (!instance_.jvm_) { + if (!instance_) { #ifdef _WIN32 std::string runtime_lib_path; bool exists = false; @@ -251,15 +259,19 @@ Env JVM::env(const char *const *options) } vm_args.nOptions = static_cast(jvm_options.size()); vm_args.options = &jvm_options[0]; + instance_ = new JVM(); void *envp = 0; - jint result = JNI_CreateJavaVM(&instance_.jvm_, &envp, &vm_args); + jint result = JNI_CreateJavaVM(&instance_->jvm_, &envp, &vm_args); if (result != JNI_OK) { + delete instance_; + instance_ = nullptr; throw JavaError(fmt::format( "Java VM initialization failed, error code = {}", result)); } - instance_.env_ = Env(static_cast(envp)); + instance_->env_ = Env(static_cast(envp)); + std::atexit(cleanup_jvm); } - return instance_.env_; + return instance_->env_; } ClassBase::~ClassBase() {} --- mp-7fd4828c934fccf7367499c9e01cc9a1e90a2093/solvers/jacop/java.h.orig 2020-03-03 23:39:58.000000000 -0700 +++ mp-7fd4828c934fccf7367499c9e01cc9a1e90a2093/solvers/jacop/java.h 2021-01-15 14:33:39.263164981 -0700 @@ -215,7 +215,8 @@ class JVM { private: JavaVM *jvm_; Env env_; - static JVM instance_; + static JVM *instance_; + static void cleanup_jvm(); JVM() : jvm_() {} ~JVM();