Неудовлетворенная ошибка ссылки:Указанная процедура не найдена

StackOverflow https://stackoverflow.com/questions/159846

  •  03-07-2019
  •  | 
  •  

Вопрос

Я пишу код JNI на C++, который будет вызываться из апплета в Windows XP.Мне удалось успешно запустить апплет, загрузить и вызвать библиотеку JNI, вплоть до того, что она вызывала функции в других DLL.Я добился этого, настроив системную переменную среды PATH, чтобы включить каталог, в котором находятся все мои DLL.

Итак, проблема в том, что я добавляю еще один вызов, который использует новую внешнюю DLL, и внезапно при загрузке библиотеки выдается UnsatisfiedLinkError.Сообщение следующее:«Указанная процедура не найдена».Кажется, это не проблема с отсутствующей зависимой DLL, поскольку я могу удалить зависимую DLL и получить другое сообщение об отсутствии зависимой DLL.Судя по тому, что мне удалось найти в Интернете, это сообщение означает, что в DLL отсутствует собственная реализация функции Java, но странно, что она работает нормально без этого дополнительного фрагмента кода.

Кто-нибудь знает, что может быть причиной этого?Какие вещи могут выдавать сообщения «Указанная процедура не найдена» для UnsatisifedLinkError?

Это было полезно?

Решение

Я понял проблему.Это было чушь.Сообщение «Указанная процедура не найдена» для UnsatisfiedLinkError указывает на то, что функция в корневой dll или в зависимая dll невозможно найти.Наиболее вероятной причиной этого в ситуации JNI является то, что собственная функция JNI экспортируется неправильно.Но это, очевидно, может произойти, если загружена зависимая DLL и в этой DLL отсутствует функция, требуемая ее родительским элементом.

Например, у нас есть библиотека input.dll.Порядок поиска DLL заключается в том, чтобы всегда сначала просматривать каталог приложения, а затем каталоги PATH.Раньше мы всегда запускали исполняемые файлы из того же каталога, что и input.dll.Однако в системном каталоге Windows есть еще один файл input.dll (который находится в середине порядка поиска DLL).Итак, если при запуске этого из Java-апплета я включаю в апплет описанный выше код, который вызывает загрузку input.dll, он загружает input.dll из системного каталога.Поскольку наш код ожидает определенных функций в input.dll, которых там нет (поскольку это другая DLL), загрузка завершается с ошибкой с сообщением об отсутствующих процедурах.Не потому, что функции JNI экспортированы неправильно, а потому, что была загружена неправильная зависимая DLL, и в ней не было ожидаемых функций.

Другие советы

Есть вероятность, что DLL была создана с использованием C++ (а не C).если вы не позаботились о том, чтобы пройти процедуру экстерном, это одна из возможных причин.

Попробуйте экспортировать все функции из DLL.Если в списке есть ваша функция, то все в порядке.

Обычно при связывании с другими библиотеками вам необходимо создать ссылку на соответствующий файл .lib.Похоже, вы не ссылаетесь на все необходимые вам файлы lib.Проверьте, что не связывается, и убедитесь, что вы добавили эту библиотеку в список компоновщика.

Вы создали новую внешнюю DLL, используя стандартную процедуру JNI?То есть, используя Javah и т. д.?Если так, то я не уверен, что не так.

Если нет, то процедура, которую вы пытаетесь вызвать, не была экспортирована (как указано в anjanb).Мне известны два способа экспорта функций:отдельный список экспорта и пометка определенных функций с помощью __declspec(dllexport).

Невозможно получить доступ к переменной в C++ DLL из приложения C. есть немного больше информации по теме DLL.

Скомпилируйте код C++ в режиме отладки.Затем вставьте DebugBreak();оператор, с которого вы хотите начать отладку.Запустите Java-код.При обнаружении оператора DebugBreak() вы увидите всплывающее окно с кнопкой «Отладка».Нажмите здесь.Dev Studio откроется с вашей программой в машинном коде.Дважды выполните отладчик, и вы сможете пройти через исходный код.

Если вы выполнили все задачи по программированию в руководствах и примерах JNI, но по-прежнему получаете ту же ошибку отсутствия процедуры, возможно, проблема связана с вашей переменной пути.Выполните следующие шаги и запустите снова:

  1. Будьте уверены, что вы установите переменную java_home в свою папку JDK (не JRE, потому что JRE не содержит заголовка JNI) Пример:На панели настроек переменных среды определите var:JAVA_HOME val:C:\Program Files\Java\jdk1.7.0_11
  2. добавлять %JAVA_HOME%\bin к вашей переменной пути

После выполнения этих шагов ваше приложение сможет правильно найти имя процедуры jni и ссылки на JNI.dll.Итак, я надеюсь, что вы больше не получите эту ошибку отсутствующей процедуры.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top