从 Visual Studio 外部创建 JVM 崩溃

Create JVM crashs outside from Visual Studio

我有以下问题。我写了一个小应用程序,它创建了一个 Java 虚拟机。如果我在 Visual Studio 内启动这个程序,它工作正常。但是,如果我在 visual studio 之外启动它,程序将无法运行,并且我会发生 ntdll.dll 崩溃。

这是我的代码:

    int result = 0;

LoadRuntimeLibrary(libPath);



// Load the JVM library 
g_jniLibrary = LoadLibrary(libPath);

if (g_jniLibrary == NULL) {

    info->Error("Could not load libary: ");
    return -1;
}

// Grab the create VM function address
JNI_createJavaVM createJavaVM = (JNI_createJavaVM)GetProcAddress(g_jniLibrary, "JNI_CreateJavaVM");
if (createJavaVM == NULL) {
    info->Error("ERROR: Could not find JNI_CreateJavaVM function");
    return -1;
}

// Count the vm args
int numVMArgs = -1;
while (vmArgs[++numVMArgs] != NULL) {}

// Add the options for exit and abort hooks
int numHooks = 0;

JavaVMOption* options = (JavaVMOption*)malloc((numVMArgs + numHooks) * sizeof(JavaVMOption));

for (int i = 0; i < numVMArgs; i++){
    options[i].optionString = vmArgs[i];
    options[i].extraInfo = 0;
}


// Setup hook pointers

options[numVMArgs].optionString = "abort";
options[numVMArgs].extraInfo = (void*)&AbortHook;
options[numVMArgs + 1].optionString = "exit";
options[numVMArgs + 1].extraInfo = (void*)&ExitHook;

JavaVMInitArgs init_args;
memset(&init_args, 0, sizeof(init_args));

init_args.version = JNI_VERSION_1_8;
init_args.options = options;
init_args.nOptions = numVMArgs + numHooks;
init_args.ignoreUnrecognized = JNI_FALSE;



result = createJavaVM(&jvm, &env, &init_args); // here is the crash





 env = GetJNIEnv(false);


Init(env);



result = RunMainClass(env, mainCls, argc, javaargs);

jvm->DestroyJavaVM();
FreeLibrary(g_jniLibrary);

return result;

我希望你有什么想法,可能有什么问题

您正在越界访问 options 数组。它仅包含 numVMArgs 个元素,因为 numHooks 为零。

这当然会导致 未定义的行为 当你这样做时

options[numVMArgs].optionString = "abort";
options[numVMArgs].extraInfo = (void*)&AbortHook;
options[numVMArgs + 1].optionString = "exit";
options[numVMArgs + 1].extraInfo = (void*)&ExitHook;

因为索引 numVMArgsnumVMArgs + 1 超出范围。