Этот вопрос похож на Q1 и Q2.JNA - UnsatisfiedLinkError: указанный модуль не найден. (на Cgwin, Win32)
Мои Java-код, который использует ЮНА, чтобы загрузить исходную библиотеку, выглядит следующим образом:
69. Print.good("found file: " + libraryPath);
70. if(System.getProperty("os.name").toLowerCase().contains("win")) {
71. final String search_path = FileFinder.getParentDirPath(libraryPath);
72. NativeLibrary.addSearchPath("libReliableServerNative",
73. search_path);
74. Print.good("Added search path: " + search_path);
75. System.setProperty("java.library.path", search_path);
76. nativeLib = (NativeLib) Native.loadLibrary("libReliableServerNative", CTest.class);
}
Мой выходной разъем, который печатает номер строки и файла библиотеки местоположение, выглядит следующим образом:
++ Thread "main": Core_Reliable.Stupid_Client_UDP_Reliable.<clinit>(Stupid_Client_UDP_Reliable.java:69)
++ found file: C:\Users\HOLLYWOOD\Documents\NetBeansProjects\ReliableServerMadeUnreliable2\build\classes\libReliableServerNative.dll
++ Thread "main": Core_Reliable.Stupid_Client_UDP_Reliable.<clinit>(Stupid_Client_UDP_Reliable.java:74)
++ Added search path: C:\Users\HOLLYWOOD\Documents\NetBeansProjects\ReliableServerMadeUnreliable2\build\classes
java.lang.UnsatisfiedLinkError: The specified module could not be found.
at com.sun.jna.Native.open(Native Method)
at com.sun.jna.Native.open(Native.java:1759)
at com.sun.jna.NativeLibrary.loadLibrary(NativeLibrary.java:260)
at com.sun.jna.NativeLibrary.getInstance(NativeLibrary.java:398)
at com.sun.jna.Library$Handler.<init>(Library.java:147)
at com.sun.jna.Native.loadLibrary(Native.java:412)
at com.sun.jna.Native.loadLibrary(Native.java:391)
at Core_Reliable.Stupid_Client_UDP_Reliable.<clinit>(Stupid_Client_UDP_Reliable.java:76)
Exception in thread "main" Java Result: 1
^Вы видите, что в строке 76 в моем Java-коде Native.loadLibrary выбрасывает UnsatisfiedLinkError.^
я исключил возможность того, что я перепутать 32- и 64-битные библиотеки, потому что я скомпилирован родной библиотеки и код Java на 32 битной машине Windows, с 32 битной Java, и указан «- m32 "параметр командной строки для gcc, который должен выводить 32-разрядную dll. Для родной компиляции я использовал cygwin.
Я также исключил возможность того, что библиотека не может быть найден, потому что, когда это было так, я получил «java.lang.UnsatisfiedLinkError: Не удалось загрузить библиотеку» вместо "выше java.lang. UnsatisfiedLinkError: указанный модуль не может быть найден "
Я думаю, что происходит это„ что он не может быть загружен ... что длл не хватает некоторых зависимостей“.. Но родная библиотека (libReliableServerNative.dll) является не более чем одним файлом C без зависимостей, отличных от стандартной библиотеки C.
Полные зависимости для libReliableServerNative:
#include<stdio.h> //printf
#include<string.h> //memset
#include<stdlib.h> //exit(0);
#include<arpa/inet.h> // inet_aton
#include<sys/socket.h> // unix socket
#include <unistd.h>
#include <netinet/in.h>
Есть ли у вас какие-либо идеи, почему это происходит?
* Update * неудовлетворенный Ошибка Link ушел, когда я положил cygwin1.dll в ЮНА пути.
Моя проблема в том, что я не получаю сообщений об ошибках. Нативный метод никогда не вызывается - не выводятся инструкции printf из собственного кода, но программа не прерывает или не бросает никаких исключений. Операторы java после вызова функции nativeLib.myFunction() не выполняются.
Для пункта 1), это не доказывает или не опровергает, что такое битность библиотеки. Чтобы точно знать, что у вас есть, используйте 'dumpbin.exe' или такую утилиту, как Dependency Walker http://www.dependencywalker.com. Другая возможность, о которой вы не упоминали, заключается в том, что у вас может быть более старая версия библиотеки, которая где-то скрывается, и это версия, которую подбирает Java. – PaulMcKenzie
Когда я загружаю dll, который был скомпилирован с помощью cycgwin, зависит ли он от отдельного файла, чье имя «cygwin.dll», или оно включено в libReliableServerNative.dll? –
Я никогда не компилировал вещь на ЛЮБОЙ ПК, кроме Windows x86 - вероятность того, что это 64-разрядный DLL-файл, практически равна нулю. Кроме того, я сделал нулевые изменения в исходном коде. Существует только одна версия. –