Загрузить библиотеку DLL Ошибка 126 - Попытка создать JVM

Я пытаюсь сделать.exe для запуска моего приложения Java. У меня есть следующий код:

Labyrinth.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

Start.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,

Что должно быть причиной ошибки?

0 ответов

Я столкнулся с той же проблемой. Зависимость Уокер не помогла. Я решил проблему с помощью Process Monitor, но мне пришлось сравнить его вывод со случаем (на другом компьютере), где DLL действительно загружалась нормально. Сравнивая операции LoadImage, я мог видеть, что LoadLibrary не работает из-за отсутствия зависимости vcruntime140.dll.

Но подождите, это еще не все! После загрузки jvm.dll я столкнулся с другой проблемой, пытаясь найти основной класс. Тот же метод привел меня к выводу, что в системе, в которой произошел сбой, отсутствует файл msvcp140.dll.

Я добавил vcruntime140.dll и msvcp140.dll, и теперь все в порядке.

Извините, я должен был упомянуть, что это использовало OpenJDK 11.0.2.

Другие вопросы по тегам