首先:我不知道这个问题是否与 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.dll
和 jli.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/