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.dlljava.dlljli.dll添加到.exe文件夹中,但是由于某些原因,它仍然无法正常工作。

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

我的安装程序当前是这样的:我有JVM4UWP静态库,该库又与jvm.lib统计链接。然后将该库包含到我正在尝试执行的Demo UWP项目中。

最佳答案

请注意,只有常规Windows API的子集可用于uwp应用程序,我怀疑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 - 在 cfml 中调用用户定义的 java 类

c++ - PyTorch C++扩展中的可选张量

c++ - 动态对齐中间指针(16字节)

c++ - vector::insert 是否只允许保留一次并避免进一步的容量检查?

java - Java中位置的无效内存访问

java - Java中的Midi设备更新列表

java - 如何在android中处理音频(.3gp)文件

java - 从actionPerformed中访问对象

java - 如何在C++(JNI)中设置正在运行的JVM的类路径?

java - Firefox ESR - 在两个不同的选项卡中加载相同的小程序两次时仅打开一个 VM