调用" JNI_CreateJavaVM"?时终止进程

时间:2018-03-27 07:56:05

标签: java c++ c java-8 jvm

我有一个.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,但它也会在该级别处理。

我不确定此异常是否阻止了进程终止,但我尝试以不同方式捕获异常:

  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);
    }
    

    但对所有流程都没有影响。

  4. 有人可以提出建议吗?

0 个答案:

没有答案