java - 从 Visual Studio 外部创建 JVM 崩溃

标签 java c++ visual-studio-2013 jvm java-native-interface

我有以下问题。我写了一个小应用程序,它创建了一个 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 超出范围。

关于java - 从 Visual Studio 外部创建 JVM 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33869943/

相关文章:

c - 字符串运行时错误仅适用于 getchar 为什么?

c# - 单例模式 - 默认属性

java - Android 解析和格式化DateTime时间戳

java - Spring MVC - 参数绑定(bind)

c++ - 如何设置在程序重新启动时不会重置的计数器?

c++ - 在 C++ 中删除数组时释放内存

c++ - 将数字添加到 ListView

c++ - 使用二进制确定图像文件的扩展类型

java - 如何在单元测试中构造 javax.jms.TextMessage ?

java - 从数据库表中获取数据