Выполнение Java-приложения, которое делает вызов JNI, с eclipse завершается неудачно с UnsatisfiedLinkError: Не удается найти зависимые библиотеки

1

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

При выполнении приложения Java с использованием Eclipse я получаю сообщение об ошибке java.lang.UnsatisfiedLinkError:... Не могу найти зависимые библиотеки

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

Я обязательно перешел в Debug View → Processs → Process Properties, чтобы получить ту же командную строку и тот же рабочий каталог, что и Eclipse.

Теги:
jni
unsatisfiedlinkerror

1 ответ

1
Лучший ответ

Вот процедура 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, а не ОС).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню