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


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

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

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

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

  1. Я запустил dependency walker. ДГ дал пару предупреждений ... это две библиотеки, необходимые библиотекой libsndfile, МНР.DLL и SHLWAPI.DLL, имел "неразрешенный импорт" - но ЧАСТО ЗАДАВАЕМЫЕ ВОПРОСЫ ДГ сказал, что эти предупреждения можно смело игнорировать.

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

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

нет кости.

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

Я делаю свою разработку в Visual Studio 2010 на MacBook pro (через Parallels). Я провожу тестирование в Windows XP на ноутбуке toshiba.

12 61

12 ответов:

Я уверен, что путь к классам и путь поиска в общей библиотеке имеют мало общего друг с другом. Согласно книга 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 это не так. Затем я использую dependency walker и обнаружил, что в Windows XP нет времени выполнения VC++ в качестве моего требования к dll. После установки VC++ Runtime package здесь это работает как шарм. То, что меня беспокоило, это то, что он продолжает говорить, что не может найти зависимые библиотеки, в то время как интуитивно зависимая dll JNI есть, однако, наконец, оказывается, что зависимая dll JNI требует другого зависимого dl. Надеюсь, это поможет.

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

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

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

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

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

  • msvcp100.dll
  • msvcr100.dll

Как только они были установлены, проект был скомпилирован и запущен нормально.

Если вы загружаете 32-разрядную версию своей dll с 64-разрядной JRE, у вас может возникнуть эта проблема. Это было мое дело.

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

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

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

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

SET PATH= "/cygdrive/c / Program Files / Java/jdk1.8. 0_45";%PATH%

в моей ситуации я пытался запустить веб-службу java в Tomcat 7 через разъем в Eclipse. Приложение хорошо работало, когда я развернул файл war в экземпляр Tomcat 7 на своем ноутбуке. Приложение требует драйвер jdbc типа 2 для "IBM DB2 9.5". По какой-то странной причине соединитель в Eclispe не мог видеть или использовать пути в переменных среды IBM DB2, чтобы добраться до dll-файлов, установленных на моем ноутбуке в качестве клиента jcc. В сообщении об ошибке либо указано, что ему не удалось найти db2jcct2 dll-файл или ему не удалось найти зависимые библиотеки для этого dll-файла. В конечном счете, я удалил соединитель и перестроил его. Тогда он работал правильно. Я добавляю это решение здесь в качестве документации, потому что я не смог найти это конкретное решение в другом месте.

  • короткий ответ: для ошибки "не удается найти зависимую библиотеку" проверьте свой $PATH (соответствует пуле #3 ниже)
  • длинный ответ:
    1. Чистый мир java: jvm использует "Classpath" для поиска файлов классов
    2. JNI world (java / native boundary): jvm использует "java.библиотека.путь " (по умолчанию $PATH) для поиска DLL
    3. чистый родной мир: собственный код использует $PATH для загрузки других DLL

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

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

и заменить

System.loadLibrary("myLibrary");

С

ReLinker.loadLibrary(context, "mylibrary");
  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).