У меня есть .dll, который загружает jvm различных версий Java, вызывая «JNI_CreateJavaVM».
Код:
(...)
JavaVMInitArgs jvmArgs;
std::vector<JavaVMOption> jvmOptions;
for (const std::string &str : options) {
JavaVMOption option;
option.extraInfo = nullptr;
option.optionString = (char *)str.c_str();
jvmOptions.push_back(option);
}
jvmArgs.nOptions = jvmOptions.size();
jvmArgs.options = &jvmOptions.front();
jvmArgs.version = JNI_VERSION_1_4;
jvmArgs.ignoreUnrecognized = JNI_FALSE;
std::string jvmPath = m_jdkProvider->getPathToJvmDll();
auto h = os_load_library(jvmPath.c_str());
if (h == nullptr) {
m_lastError = "Can not load " + jvmPath;
return false;
}
auto JNI_CreateJavaVM = (JNI_CreateJavaVMType)os_get_proc_address(h, "JNI_CreateJavaVM");
if (JNI_CreateJavaVM == nullptr) {
m_lastError = "failed to create Java VM. JNI_CreateJavaVM is not found in library " + jvmPath;
return false;
}
MessageBox(NULL, "I'm before JNI_CreateJavaVM", "Info", MB_OK);
JNIEnv *env;
int res;
CLrJavaToCppException ex;
ex.Enable();
try {
res = JNI_CreateJavaVM(&m_jvm, reinterpret_cast<void **>(&env), &jvmArgs);
}
catch (std::exception ex) {
MessageBox(NULL, "I'm in JNI_CreateJavaVM exception", "Info", MB_OK);
}
MessageBox(NULL, "I'm after JNI_CreateJavaVM", "Info", MB_OK);
if (res < 0) {
(...)
Эта DLL может быть вызвана двумя разными процессами: один написан на C ++, а другой на C #.
При вызове JVM Java 8, процесс написан на C ++ заканчивается неожиданно, пока один в C # продолжает работать.
Я знаю, что JNI преднамеренно выдает исключение 0xC0000005 для разных целей, но это также обрабатывается на этом уровне.
Я не уверен, что завершение процесса вызвано этим исключением, но я пытался перехватить исключение по-разному:
_se_translator_function
— смог поймать только исключение в процессе C # -типаint res;
__try {
res = JNI_CreateJavaVM(&m_jvm, reinterpret_cast<void **>(&env), &jvmArgs);
}
__except (EXCEPTION_EXECUTE_HANDLER) {
MessageBox(NULL, "I'm in JNI_CreateJavaVM exception", "Info", MB_OK);
}
но без эффекта ни для одного из процессов.
Может кто-то что-то предложить?
Задача ещё не решена.
Других решений пока нет …