java.lang.UnsatisfiedLinkError: метод внутри dll недоступен - PullRequest
4 голосов
/ 12 февраля 2010

Я пытаюсь получить доступ к функции, доступной внутри DLL-файла. Но это дает исключение типа «Исключение в потоке» main «java.lang.UnsatisfiedLinkError: * .jniGetAudioInputLevel () D». Файл DLL загружен, но когда я пытаюсь получить доступ к методам, он выдает сообщение об ошибке.

По моим сведениям: -

  • Это исключение возникает только в том случае, если .dll нет в пути к классам или dll отсутствует в файле jar.
  • .dll файл создается только в том случае, если весь код выполняется без каких-либо ошибок.
  • Я видел методы в dll с использованием таких инструментов, как, например: Anywhere PE Viewer, PE Explorer и т. Д. Они оба показывают методы, доступные в DLL-файле.

Как это в доступности функции можно настроить с помощью любой другой идеи?

Ответы [ 3 ]

6 голосов
/ 12 февраля 2010

UnsatisfiedLinkError также генерируется, если не удается найти собственный аналог метода, объявленного собственным. Это может легко произойти, если нативный код не был назван с полным именем пакета Java, разделенным с помощью '_'.

Например,

package com.mycompany.stuff;

public native void doSomething();

Требуется, чтобы собственная библиотека (DLL, * SRVPGM и т. Д. В зависимости от вашей системы) находилась и загружалась с помощью System.loadLibrary (), которая содержит и экспортирует функцию с именем

com_mycompany_stuff_doSomething

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

4 голосов
/ 21 марта 2012

Я согласен с Software Monkey , но у меня есть одно очень важное дополнение, связанное с именем функции. Имя функции в собственной библиотеке должно начинаться с '_Java_'. В вашем случае это должно быть:

_Java_com_mycompany_stuff_doSomething

Я обнаружил это случайно и потратил два дня, чтобы выяснить, почему JVM не может найти функцию в DLL, если она там есть. В моем случае javah генерирует заголовочный файл с именем функции без знака подчеркивания перед «Java_». Поэтому мне пришлось обновить его вручную, чтобы заставить его работать.

Интересно, почему это не упоминалось о префиксе подчеркивания в «Java Native Interface: Руководство программиста и спецификация», «Java Native Interface 6.0 Specification», предоставляемых с документацией Java 6 (я работал с jdk 1.6.0_30, но JDK версия не должна быть проблемой) и некоторые другие ресурсы.

0 голосов
/ 12 февраля 2010

Обычно мы получаем это исключение, когда JVM не может найти файл .dll.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...