Вызов метода динамической библиотеки — проект IntelliJ IDEA — Java

У меня есть следующая собственная функция Java

private static native void fillEnergyArrays(double currentTemp, double concNA, double concMG);

Функция реализована на C. Код был протестирован, и я создал работающую динамическую библиотеку libhyfiModel.jnilib, которую можно использовать для вызова метода из Java-файла Temp.java. Никаких проблем в этом случае, когда я запускаю программу с одним файлом. Вызов метода работает и возвращает ожидаемое значение.

Проблема:

Я беру Temp.java и libhyfiModel.jnilib и пытаюсь импортировать их в большой проект IntelliJ IDEA, который использует Maven в качестве менеджера сборки. Я поместил свой файл libhyfiModel.jnilib в правильный каталог, чтобы он загружался при выполнении программы. Я дважды проверил, что он загружается с помощью этого кода в Temp.java:

static {
    try {
        System.loadLibrary("hyfiModel");
    }
    catch (UnsatisfiedLinkError e) {
        System.err.println("Native code library failed to load\n" + e);
    }
}

Здесь не выдается исключение, поэтому libhyfiModel.jnilib найден и загружен правильно, но при выполнении собственного метода я получаю следующую ошибку:

Исключение в потоке «основной» java.lang.UnsatisfiedLinkError: ca.virology.baseByBase.DiffEditor.fillEnergyArrays(DDD)V в ca.virology.baseByBase.DiffEditor.fillEnergyArrays(собственный метод) в ca.virology.baseByBase.DiffEditor.main( DiffEditor.java:266)

Я просмотрел документацию здесь https://www.jetbrains.com/idea/help/configuring-module-dependencies-and-libraries.html и безуспешно следовал инструкциям.

Итак, динамическая библиотека загружается, и я добавил каталог, содержащий libhyfiModel.jnilib, в качестве зависимости, но метод не может быть выполнен... Что мне не хватает?

ИЗМЕНИТЬ:

Я создал новый проект IntelliJ только с Temp.java, и я могу вызывать нативную функцию без ошибок, поэтому я думаю, что должна быть проблема с конфигурациями моего проекта. Есть специалисты по IntelliJ?


person samT    schedule 20.10.2015    source источник


Ответы (1)


Догадаться. Это не было ошибкой конфигурации, так как библиотека загружалась правильно. Проблема заключалась в членстве в пакете Temp.java, используемом в проекте IntelliJ.

У меня был файл Temp.h, созданный с помощью команды javah -jni Temp, который содержит определения функций C для моих собственных функций.

Я не понимал, что собственные определения функций в Temp.h отличаются, когда файл Java Temp.java имеет указанный пакет.

Я нашел свой ответ в Другой JNI, C++, DLL, UnsatisfiedLinkError ‹Native Method›< /а>

Показано, что имена функций заголовочных файлов меняются в зависимости от членства в пакете.

person samT    schedule 21.10.2015