JVM завершается без каких-либо сообщений об ошибках при загрузке скомпилированной DLL

#java #c #jvm #java-native-interface

#java #c #jvm #java-native-interface

Вопрос:

Я пытаюсь вызвать функцию c из Java. При загрузке библиотеки (в Test.java ) 2 вещи происходят случайным образом:

  • печатается «Load Lib», и jvm просто завершает работу без каких-либо ошибок
  • печатается «Load Lib», и jvm застревает в цикле

Странно то, что «иногда» «загруженная библиотека» тоже печатается. Это означает, что библиотека была загружена…

Мой вопрос в том, как я могу это исправить? Реальная проблема в том, что я не знаю, что я делаю неправильно.

Этапы компиляции DLL:

  • gcc -fpic -I «C:Program Файлы Java jdk-15 включают » -I «C:Program FilesJavajdk-15includewin32» -c BindLib.c BindLib.h
  • gcc -fpic -s -shared -o BindLib.dll BindLib.o

Информация о системе:

  • 64-разрядная версия Windows 10, версия 1909
  • Java 15

Основной файл:

 package degubi;

public final class Main {

    public static void main(String[] args) {
        Test.enable();
    }
}
  

Файл библиотеки:

 package degubi;

public class Test {
    static {
        System.out.println("Load lib");
        System.loadLibrary("BindLib");
        System.out.println("Lib loaded");
    }

    public static native void enable();
}
  

Исходный файл:

 #include "windows.h"
#include "BindLib.h"

JNIEXPORT void JNICALL Java_degubi_Test_enable(JNIEnv* env, jclass clazz) {

}
  

Заголовочный файл:

 #define __int64 long long
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class degubi_Test */

#ifndef _Included_degubi_Test
#define _Included_degubi_Test
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     degubi_Test
 * Method:    enable
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_degubi_Test_enable(JNIEnv *, jclass);

#ifdef __cplusplus
}
#endif
#endif
  

Ответ №1:

Какую оболочку и компилятор C вы использовали? Проблема может возникнуть из-за несовместимости компилятора C и среды оболочки.

Например, если вы используете компилятор Cygwin для компиляции DLL, а затем выполняете двоичный файл в Windows CMD, программа может не работать (зависимости от cygwin.dll ).

Комментарии:

1. Я использовал Cygwin для компиляции. Я пробовал запускать его внутри IDE и в CMD (jar, созданный с помощью «mvn clean install», запускался с java -jar «jarName»), каждый раз происходило одно и то же

2. Извините за задержку ответа. Если вы компилируете собственную библиотеку на Cygwin, то лучше запускать ее в оболочке Cygwin.

Ответ №2:

В итоге я создал проект в Visual Studio и создал его оттуда… работал отлично. Все еще не знаю, что вызвало проблему.