java - 在 UWP C++ 应用程序中生成 JVM 时崩溃

标签 java c++ jvm uwp java-native-interface

首先:我不知道这个问题是否与 UWP 有关,它是奇怪的安全设置,还是我误用了 JNI 的 Invocation

无论如何,我使用此代码在 C++ 静态库中生成一个 jvm(使用 /ZW,因此针对 UWP 进行编译,但禁用它不会改变任何事情)。

以下代码基于Oracle的笔记和openjdk的代码(exeinvoke.c, launcher.c, ...):

void JVM4UWP::loadVM(string vmOptions[], int numOptions, int jni_version) {
    /* Copy the VM Options */
    options = new JavaVMOption[numOptions];
    for (uint8_t i = 0; i < numOptions; i++) {
        options[i].optionString = new char[vmOptions[i].length() + 1]; // \0 takes the additional byte
        strncpy_s(options[i].optionString, vmOptions[i].length() + 1, vmOptions[i].c_str(), vmOptions[i].length() + 1);
    }

    //options[0].optionString = "-Djava.class.path=/usr/lib/java";
    vm_args = new JavaVMInitArgs();
    vm_args->version = jni_version;
    vm_args->nOptions = numOptions;
    vm_args->options = options;
    vm_args->ignoreUnrecognized = false;

    /* load and initialize a Java VM, return a JNI interface
    * pointer in env */
    JNI_CreateJavaVM(&jvm, (void**)&env, vm_args);
    delete options;

    /* invoke the Main.test method using the JNI */
    jclass cls = env->FindClass("Main");
    jmethodID mid = env->GetStaticMethodID(cls, "main", "(I)V");
    env->CallStaticVoidMethod(cls, mid, 100);

    /* We are done. */
    jvm->DestroyJavaVM();
}

现在的问题是:我添加了 #include <jni.h> , 我添加了 lib/jvm.lib作为静态库(取自 oracle 的 jdk),但是似乎有些东西仍然不完整。

当我运行该应用程序时,加载时出现错误(示例 UWP 应用程序的 App::App 甚至没有运行)。

控制台返回:

Das Programm "[1892] TestJVM.exe" wurde mit Code -1073741515 (0xc0000135) 'Es wurde keine abhängige DLL gefunden' beendet.

粗略翻译为:Could find no dependant dll .

现在这让我想起了 this MSDN 文章。我不得不承认我并不完全理解它的内容。特别是因为 jvm.lib 不能有任何 list 。我尝试添加 jvm.dll , java.dlljli.dll到 .exe 的文件夹,但由于某种原因它仍然不起作用。

由于上面的代码应该在没有 dll 的情况下工作,我认为它可能与 UWP 有关,甚至可能与我的代码有关:

我目前的设置是这样的:我有 JVM4UWP静态库反过来与 jvm.lib 进行统计链接.该库随后包含在我尝试执行的演示 UWP 项目中。

最佳答案

请注意,uwp 应用程序只能使用常用 Windows API 的子集,我怀疑 jvm 是否与这些限制兼容。 “lib/jvm.lib”实际上可能是一个导出库,而不是静态库。

您可能还想熟悉 Using a Win32 DLL in a Universal Windows Platform App .

关于java - 在 UWP C++ 应用程序中生成 JVM 时崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43985494/

相关文章:

java - 在JAVA中执行linux命令行

java - 将泛型类作为参数传递

c++ - 将罗马数字转换为小数c++

java - 在 MacOS 中运行 jmap 命令失败

java.net.BindException : Address already in use: JVM_Bind BUT NO port using it

java - 是否可以通过编程方式将 HTML 5 Canvas 元素的内容抓取到视频中?

java - 使用 Spring Data R2DBC 进行批量插入时检索生成的 ID

c++ - C++ 快速编译

c++ - 提高特定任务的 tesseract 性能

java - 尝试增加 jvm 内存时,您可以将 Xmx 设置为最大数量吗?