Как исправить ошибку UnsatisfiedLinkError (невозможно найти зависимые библиотеки) в проекте JNI

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

Вопрос

Я работаю над проектом Java, который использует JNI.JNI вызывает собственную библиотеку, которую я написал сам, скажем, mylib.dll, и это зависит от сторонней библиотеки libsndfile-1.dll.

Когда я запускаю свою программу, она вылетает с

java.lang.UnsatisfiedLinkError:  C:\...path...\mylib.dll: Can't find dependent libraries.

Я искал этот сайт (и другие) и попробовал ряд исправлений:

  1. Я запустил Dependency Walker.DW сделал пару предупреждений о том, что две библиотеки, необходимые для libsndfile, MPR.DLL и SHLWAPI.DLL, имеют «неразрешенный импорт», но Часто задаваемые вопросы по ДВ сказал, что эти предупреждения можно смело игнорировать.

  2. Я исправил имена методов в mylib.dll, как было предложено. здесь.Имена методов каким-то образом были искажены компилятором, но я добавил флаги компоновщика, и имена методов dll теперь точно соответствуют именам в моем заголовочном файле jni.

  3. Я поместил все эти библиотеки DLL в один и тот же каталог — тот же каталог, что и .jar, который их вызывает, — чтобы убедиться, что они находятся в правильном PATH.

Никаких кубиков.

Кто-нибудь знает, что происходит?

Я занимаюсь разработкой в ​​Visual Studio 2010 на MacBook Pro (через Parallels).Я провожу тестирование в Windows XP на ноутбуке Toshiba.

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

Решение

Я почти уверен, что путь к классам и путь поиска в общей библиотеке не имеют ничего общего друг с другом.В соответствии с Книга JNI (который, по общему признанию, устарел), в Windows, если вы не используете java.library.path системное свойство, DLL должна находиться в текущем рабочем каталоге или в каталоге, указанном в Windows. PATH переменная среды.


Обновлять:

Похоже, Oracle удалила PDF-файл со своего сайта.Я обновил ссылку выше, чтобы указать на экземпляр PDF-файла, живущий в Техасском университете в Арлингтоне.

Кроме того, вы также можете прочитать HTML-версию Oracle Спецификация JNI.Он находится в разделе Java 8 на веб-сайте Java и, надеюсь, будет там какое-то время.


Обновление 2:

По крайней мере, в Java 8 (более ранние версии я не проверял) вы можете сделать:

java -XshowSettings:properties -version

чтобы найти путь поиска общей библиотеки.Ищите значение java.library.path свойство в этом выводе.

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

Я хочу сообщить этот интересный случай, после пробования все вышеуказанного метода ошибка все еще там.Странная вещь - это работает на компьютере Windows 7, но на Windows XP это нет.Затем я использую Tency Walker и обнаружил на Windows XP, в качестве моего DLL нет времени выполнения VC ++.После установки пакета во время выполнения VC ++ Здесь это работает как шармОтказТо, что мне беспокоит, это продолжает говорить, не может найти зависимые библиотеки, в то время как интуитивно зависимая DLL DLL JNI, однако, она, наконец, оказывается зависимой JNI DLL, требует другого зависимого DL.Я надеюсь, что это поможет.

Вам нужно загрузить свою библиотеку JNI.

System.LoadLibrary загружает DLL изПуть JVM (путь Bin JDK).

Если вы хотите загрузить явный файл с помощью пути, используйте Система.Нагрузка ()

Смотрите также: разница между System.bload () иSystem.LoadLibrary в Java

Пожалуйста, проверьте ваш путь к библиотеке правильно или нет.Конечно, вы можете использовать следующий код, чтобы проверить путь к пути библиотеки: System.out.println(System.getProperty("java.library.path"));

Вы можете назначить java.library.path при запуске приложения Java:

java -Djava.library.path=path ...
.

Если вы загружаете 32-битную версию вашей DLL с 64-битной JER, вы можете иметь этот вопрос.Это был мой случай.

У

имел идентичную проблему с помощью машины XP при установке javacv и opencv в сочетании с Eclipse.Оказалось, что мне не хватало следующих файлов:

    .
  • msvcp100.dll
  • msvcr100.dll

После того, как они были установлены, проект скомпилирован и управлял хорошо.

    .
  • Краткий ответ: для ошибки «не могу найти ошибку« зависимой библиотеки », проверьте свой $ PATH (соответствует пулевой точке № 3 ниже)
  • Долгий ответ:
    1. Pure Java World: JVM использует «ClassPath», чтобы найти файлы классов
    2. World JNI (Java / родная граница): JVM использует «Java.library.Path» (которые по умолчанию до $ PATH), чтобы найти DLLS
    3. Чистый родной мир: родной код использует $ путь для загрузки других dlls

Я нашел отличную статью некоторыми друзьями в ManageSafe, которая прошла одно и то же, что я сделал.Это сработало для меня, поэтому, надеюсь, это поможет вам также!Есть чтение, если вы заинтересованы ( Опытки погрузки нативных библиотек на Android ) или просто используйте

compile 'com.getkeepsafe.relinker:relinker:1.2.3'

и заменить

System.loadLibrary("myLibrary");
.

с

ReLinker.loadLibrary(context, "mylibrary");
.

У меня именно именно такая же проблема, и, наконец, она была решена.

Я поставил все зависимые dll в одну и ту же папку, где был сохранен и убедиться, что MyLib.dll был сохранен и убедиться, что компилятор Java может найти его (если нет myLib.dll в пути компиляции, будет сообщена об ошибке, сообщая об этом во время компиляции).Важно отметить, что вы должны уведомить, что вы должны убедиться, что все зависимые libs имеют одну и ту же верность с mylib.dll, например, если ваш mylib.dll - версия выпуска, то вы также должны поместить версию выпуска всех его зависимых libsОтказ

Надеюсь, это может помочь другим, которые столкнулись с той же проблемой.

У меня была такая же проблема, и я пробовал все, что размещено здесь, чтобы исправить это, но никто не сработал для меня. В моем случае я использую Cygwin для компиляции DLL.Похоже, что JVM пытается найти JRE DLLs на виртуальном пути Cygwin. Я добавил путь виртуального каталога Cygwin в DLL JRE и работает сейчас. Я сделал что-то вроде:

set path="/ cygdrive / c / program files / java / jdk1.8.0_45";% Path%

В моей ситуации я пытался запустить веб-сервис Java в Tomcat 7 через разъем в Eclipse.Приложение хорошо проработало, когда я развернул файл войны в экземпляр Tomcat 7 на моем ноутбуке.Приложение требует драйвера JDBC типа 2 для «IBM DB2 9,5».Для некоторой странной причины разъем в ECLISPE не мог видеть или использовать пути в переменных среды IBM DB2, чтобы достичь файлов DLL, установленных на моем ноутбуке в качестве клиента JCC.Сообщение об ошибке либо заявляло, что не удалось найти файл DB2JCCT2 DLL, либо не удалось найти зависимые библиотеки для этого файла DLL.В конечном итоге я удалил разъем и перестроил его.Тогда это работало правильно.Я добавляю это решение здесь в качестве документации, потому что я не смог найти это конкретное решение где-либо еще.

Создание статической библиотеки работала для меня, компиляции с использованием g++ -static.Это связывает зависимые библиотеки вместе с сборкой.

Установка Microsoft Visual C ++ 2010 SP1 перераспределена исправлена IT

Разместите необходимые DLL в папку и установите путь к папке в переменной среды пути. Убедитесь, что обновленная переменная пути среды отражена.

Я столкнулся с такой же проблемой с библиотекой FFMPEG после объединения двух проектов Android в качестве одного проекта.

На самом деле выпуск поступил из-за двух разных версий библиотеки FFMPEG, но они были загружены с такими же именами в памяти.Одна библиотека была помещена в JNILIBS, а другая была внутри другой библиотеки, используемой в качестве модуля.Я не смог изменить код модуля, так как он был готов, поэтому я переименовал в моем собственном коде для FFMPEGCAMERA и загрузил его в память с тем же именем.

System.loadLibrary("ffmpegCamera");
.

Это разрешено проблему, и теперь обе версии библиотек загружаются хорошо, как отдельное имя и идентификатор процесса в памяти.

  1. Перейти к http://tess4j.sourceforge.net/usage.html и нажмите на Visual C++ Redistributable for VS2012
  2. Скачай его и запускай VSU_4\vcredist_x64.exe или VSU_4\vcredist_x84.exe в зависимости от конфигурации вашей системы
  3. Положите свой dll файлы внутри lib папка вместе с вашими другими библиотеками (например \lib\win32-x86\your dll files).
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top