我有一个.dll,它通过调用" JNI_CreateJavaVM"来加载不同Java版本的jvm。
代码:
(...)
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 of Java 8 时,用 C ++编写的进程意外终止,而 C#中的进程继续运行。
我知道JNI故意抛出0xC0000005异常for different purposes,但它也会在该级别处理。
我不确定此异常是否阻止了进程终止,但我尝试以不同方式捕获异常:
_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);
}
但对所有流程都没有影响。
有人可以提出建议吗?