#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 и создал его оттуда… работал отлично. Все еще не знаю, что вызвало проблему.