2015-08-03 2 views
0

Этот вопрос похож на 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.^

  1. я исключил возможность того, что я перепутать 32- и 64-битные библиотеки, потому что я скомпилирован родной библиотеки и код Java на 32 битной машине Windows, с 32 битной Java, и указан «- m32 "параметр командной строки для gcc, который должен выводить 32-разрядную dll. Для родной компиляции я использовал cygwin.

  2. Я также исключил возможность того, что библиотека не может быть найден, потому что, когда это было так, я получил «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() не выполняются.

+0

Для пункта 1), это не доказывает или не опровергает, что такое битность библиотеки. Чтобы точно знать, что у вас есть, используйте 'dumpbin.exe' или такую ​​утилиту, как Dependency Walker http://www.dependencywalker.com. Другая возможность, о которой вы не упоминали, заключается в том, что у вас может быть более старая версия библиотеки, которая где-то скрывается, и это версия, которую подбирает Java. – PaulMcKenzie

+0

Когда я загружаю dll, который был скомпилирован с помощью cycgwin, зависит ли он от отдельного файла, чье имя «cygwin.dll», или оно включено в libReliableServerNative.dll? –

+0

Я никогда не компилировал вещь на ЛЮБОЙ ПК, кроме Windows x86 - вероятность того, что это 64-разрядный DLL-файл, практически равна нулю. Кроме того, я сделал нулевые изменения в исходном коде. Существует только одна версия. –

ответ

0

У меня это работает. Если вы скомпилируете cygwin, вы должны поместить cygwin1.dll в путь ресурса.

+0

Скомпилируйте с помощью компилятора mingw, чтобы опустить зависимость cygwin.Это может потребовать нескольких исправлений исходного кода, но вы получите что-то более похожее на то, что будет генерировать компилятор MS, и никакие зависимости cygwin. – technomage

+0

Я не против иметь зависимость от DLL-файла - это всего лишь один DLL-файл. Моя проблема в том, что я не получаю никаких сообщений об ошибках. Нативный метод никогда не вызывается - не выводятся инструкции printf из собственного кода, но программа не прерывает или не бросает никаких исключений. Операторы java после вызова nativeLib.myFunc() также не выполняются. –

Смежные вопросы