java — завершение процесса при вызове & quot; JNI_CreateJavaVM & quot ;?

У меня есть .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 для разных целей, но это также обрабатывается на этом уровне.

Я не уверен, что завершение процесса вызвано этим исключением, но я пытался перехватить исключение по-разному:

  1. Сборка проекта с (/ EHa) — нет эффекта.
  2. С помощью _se_translator_function — смог поймать только исключение в процессе C # -типа
  3. 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);
    }
    

    но без эффекта ни для одного из процессов.

Может кто-то что-то предложить?

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]