У меня есть Java-программа, которая вызывает функцию в библиотеке JNI. Код JNI статически загружает другую разделяемую библиотеку.
При выполнении приложения Java с использованием Eclipse я получаю сообщение об ошибке java.lang.UnsatisfiedLinkError:... Не могу найти зависимые библиотеки
Но, если я выполняю ту же команду в командной строке, программа работает нормально. Что я делаю неправильно в Eclipse?
Я обязательно перешел в Debug View → Processs → Process Properties, чтобы получить ту же командную строку и тот же рабочий каталог, что и Eclipse.
Вот процедура PD, которая может помочь вам идентифицировать проблему.
Добавьте в свою программу следующую информацию, чтобы определить различия в пути арки и загрузки между двумя средами среды выполнения. Исследуйте любые различия в пути/арке.
System.out.println(System.getProperty("java.library.path"));
System.out.println(System.getProperty("sun.arch.data.model"));
Вы можете использовать утилиту dumpbin.exe для определения зависимостей, необходимых для загружаемой DLL. Убедитесь, что существуют зависимости. Пример использования:
C:> dumpbin /imports your.dll
Dump of file your.dll
File Type: DLL
Section contains the following imports:
**KERNEL32.dll**
Вы можете использовать команду where.exe, чтобы найти местоположение зависимостей. Пример использования:
C:>where KERNEL32.dll
C:\Windows\System32\kernel32.dll
Если ты видишь:
C:>where KERNEL32.dll
INFO: Could not find files for the given pattern(s)
Изучите, почему зависимая DLL не находится на пути.
Вы можете использовать команду dumpbin.exe для проверки 64-битного и 32-битного.
Пример:
C:>dumpbin /headers yourd.dll
Dump of file yourd.dll
PE signature found
File Type: DLL
FILE HEADER VALUES
14C machine (x86) <-- 32bit DLL
C:>dumpbin /headers yourd.dll
Dump of file yourd.dll
PE signature found
File Type: DLL
FILE HEADER VALUES
8664 machine (x64) <-- 64bit DLL
Исследуйте любые 32-разрядные и 64-разрядные несоответствия между основными/зависимыми. Если ваша JVM 32-битная, вам нужно использовать 32-битные DLL файлы. Если ваша JVM составляет 64 бит, вам необходимо использовать 64-битные DLL файлы. (Это нормально для запуска 32-битной JVM на 64-битной ОС, но JNI DLL должны быть 32 бит (DLL соответствуют JVM, а не ОС).