Как исправить UnsatisfiedLinkError (Не удается найти зависимые библиотеки) в проекте JNI - PullRequest
73 голосов
/ 23 мая 2011

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

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

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

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

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

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

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

Без кубиков.

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

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

Ответы [ 13 ]

1 голос
/ 09 октября 2011

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

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

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

0 голосов
/ 28 июня 2019

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

0 голосов
/ 22 сентября 2015
  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).
...