2

我正在尝试制作一个 .exe 来运行我的 Java 应用程序。我有以下代码:

迷宫.c

#include <windows.h>
#include <stdio.h>
#include <jni.h>

#define MAIN_CLASS "game/main/Game"

__declspec(dllexport) __stdcall int run(){
    JNIEnv*         env;
    JavaVM*         jvm;
    JavaVMInitArgs  vmargs;
    JavaVMOption    options[1];
    jint            rc;
    jclass          class;
    jmethodID       mainID;

    vmargs.version = 0x00010002;
    options[0].optionString = "-Djava.class.path=.";
    vmargs.options = options;
    vmargs.nOptions = 1;
    rc = JNI_CreateJavaVM(&jvm, (void**) &env, &vmargs);
    if(rc < 0){
        printf("Failed creating JVM");
        return 1;
    }
    class = (*env)->FindClass(env, MAIN_CLASS);
    if(class == 0){
        printf("Failed finding the main class");
        return 1;
    }
    mainID = (*env)->GetStaticMethodID(env, class, "main", "([Ljava/lang/String;)V");
    if(mainID == 0){
        printf("Failed finding the main method");
        return 1;
    }
    (*env)->CallStaticVoidMethod(env, class, mainID, 0);
    (*jvm)->DestroyJavaVM(jvm);
    return 0;
}

然后编译为 OpenLabyrinth.dll

我有一个程序试图运行 dll

开始.c

#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <direct.h>

typedef int (__stdcall* function)();

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow){
    HINSTANCE hGetProcIDDLL = LoadLibrary("OpenLabyrinth.dll");
    if(!hGetProcIDDLL){
        printf("Couldn't find the library: %d", GetLastError());
        return 1;
    }
    function run = (function) GetProcAddress(hGetProcIDDLL, "run");
    if(!run){
        printf("Couldn't find the function: %d", GetLastError());
        return 1;
    }
    run();
    return 0;
}

后来编译成Labyrinth.exe

运行我的应用程序时,我得到 LoadLibrary 错误代码 126。我尝试用谷歌搜索错误 126,发现我的 .dll 需要依赖项。

检查它Process Monitor我发现我的程序执行的每个操作都是成功的,但它返回代码 1。

但是,当我使用它进行检查时,Dependency Walker我显示了很多丢失的文件。他们都是API-MS-WIN-CORE-something或者EXT-MS-WIN-something

什么应该导致错误?

4

1 回答 1

2

我刚刚遇到了同样的问题。依赖沃克没有帮助。我在 Process Monitor 的帮助下解决了这个问题,但是我必须将它的输出与 DLL 实际加载正常的情况(在不同的机器上)进行比较。通过比较 LoadImage 操作,我可以看到 LoadLibrary 由于缺少依赖项 vcruntime140.dll 而失败。

但是等等还有更多!在我加载了 jvm.dll 之后,我在试图找到主类时遇到了另一个问题。同样的技术让我看到我在失败的系统上丢失了 msvcp140.dll。

我添加了 vcruntime140.dll 和 msvcp140.dll 现在一切都很好。

抱歉,应该提到这是使用 OpenJDK 11.0.2。

于 2019-03-06T21:17:12.987 回答