Как исправить неудовлетворенную ошибку Linkerror (не удается найти зависимые библиотеки) в проекте JNI
Я работаю над проектом Java, который использует JNI. JNI вызывает пользовательскую библиотеку, которую я написал сам, скажем mylib.dll, и это зависит от сторонней библиотеки libsndfile-1.файл DLL.
когда я запускаю свою программу, она падает с
java.lang.UnsatisfiedLinkError: C:...path...mylib.dll: Can't find dependent libraries.
Я искал этот сайт (и другие) и я пробовал несколько исправлений:
Я запустил dependency walker. ДГ дал пару предупреждений ... это две библиотеки, необходимые библиотекой libsndfile, МНР.DLL и SHLWAPI.DLL, имел "неразрешенный импорт" - но ЧАСТО ЗАДАВАЕМЫЕ ВОПРОСЫ ДГ сказал, что эти предупреждения можно смело игнорировать.
я исправил имена методов в mylib.dll, как и предлагалось здесь. Имена методов каким-то образом были искажены компилятором, но я добавил флаги компоновщика, и имена методов dll теперь точно совпадают с именами в моем заголовочном файле jni.
я помещаю все эти DLL в один каталог -- тот же каталог, что и этот.jar, который вызывает их-чтобы убедиться, что они на правильном пути.
нет кости.
кто-нибудь знает, что происходит?
Я делаю свою разработку в Visual Studio 2010 на MacBook pro (через Parallels). Я провожу тестирование в Windows XP на ноутбуке toshiba.
12 ответов:
Я уверен, что путь к классам и путь поиска в общей библиотеке имеют мало общего друг с другом. Согласно книга JNI (который, по общему признанию, старый), на Windows, Если вы не используете
java.library.path
системное свойство, DLL должна быть в текущем рабочем каталоге или в каталоге, указанном в WindowsPATH
переменные среды.
обновление:
похоже, 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. Надеюсь, это поможет.
пожалуйста, убедитесь, что ваш путь к библиотеке правильный или нет. Конечно, вы можете использовать следующий код для проверки пути к библиотеке:
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 ниже)
- длинный ответ:
- Чистый мир java: jvm использует "Classpath" для поиска файлов классов
- JNI world (java / native boundary): jvm использует "java.библиотека.путь " (по умолчанию $PATH) для поиска DLL
- чистый родной мир: собственный код использует $PATH для загрузки других DLL
Я нашел отличную статью некоторых друзей в keepsafe, которые прошли через то же самое, что и я. Это сработало для меня, так что, надеюсь, это поможет вам также! Есть читать, если вы заинтересованы ( опасности загрузки собственных библиотек на Android) или просто использовать
compile 'com.getkeepsafe.relinker:relinker:1.2.3'
и заменить
System.loadLibrary("myLibrary");
С
ReLinker.loadLibrary(context, "mylibrary");
- перейти к http://tess4j.sourceforge.net/usage.html и нажмите на
Visual C++ Redistributable for VS2012
- загрузите его и запустите
VSU_4\vcredist_x64.exe
илиVSU_4\vcredist_x84.exe
в зависимости от конфигурации системы- положить
dll
файлы внутриlib
папка, наряду с другими библиотеками (например,\lib\win32-x86\your dll files
).