2015-11-11 2 views
3

Я хочу вызвать метод .DLL в Eclipse. Вот мой код:Загрузка .DLL в Java

class TestJNI1 { 
      public native void LireNoVersion(); 
      public void a() { 
       System.loadLibrary("tttt.dll"); 
       LireNoVersion(); 
      } 

     } 

    public GlobalAction() { 
     this.setBackground(GlobalPreferences.PANEL_BACKGROUND_COLOR); 
     new TestJNI1().a(); 
    } 

Проблема заключается в том, что у меня есть эта ошибка при компиляции

Exception in thread "AWT-EventQueue-0" java.lang.UnsatisfiedLinkError: Expecting an absolute path of the library: tttt.dll at java.lang.Runtime.load0(Unknown Source) at java.lang.System.load(Unknown Source) 

Я уже пытался:

  • аргументы Набор в Затмении
  • Moving в корень проекта и папка System32
  • Добавлен путь к папке в локальной библиотеке loca Тион в Затмении
  • Изменение% PATH% в окнах
  • Давать абсолютный путь в качестве аргумента
  • Пытаюсь с "tttt.dll", "./tttt.dll" и ".tttt.dll"
  • вызовов с System.loadLibrary(...) и System.load(...)

UPDATE

Я попытался напечатать java.library.path и получить путь. Я поставил DLL в этом пути, и сообщение об ошибке более запутанным Сейчас:

Exception in thread "AWT-EventQueue-0" java.lang.UnsatisfiedLinkError: D:\My\Exact\Path\tttt.dll: Can't find dependent libraries 

Вот код, чтобы напечатать путь:

String property = System.getProperty("java.library.path"); 
StringTokenizer parser = new StringTokenizer(property, ";"); 
while (parser.hasMoreTokens()) { 
    System.err.println(parser.nextToken()); 
} 
+0

Это работает, если вы указали абсолютный путь к вашей DLL i.e 'C:/tttt.dll'? Пробовали ли вы все следующие примеры: https://www.chilkatsoft.com/java-loadLibrary-Windows.asp – Cyclonecode

+0

И вы получаете то же сообщение об ошибке **, когда ** вы указываете абсолютный путь, то есть 'C:/tttt.dll'? – Cyclonecode

+0

Да, я тоже пробовал – Totem

ответ

0

Использование интерфейса Library в sun.jna пакете сделал трюк:

import com.sun.jna.Library; 
    import com.sun.jna.Native; 

    public class DllTest { 
    public interface IDLL extends Library { 
     IDLL INSTANCE = (simpleDLL) Native.loadLibrary("tttt", IDLL.class); 

     int LireNoVersion(); // DWORD LireNoVersion(); 
    } 

    public static void main(String[] args) { 
     IDLL sdll = IDLL.INSTANCE; 

     int nover = sdll.LireNoVersion(); 

     System.out.println("version = " + nover + "\n"); 

    } 

} 

До сих пор не знаю, почему он не работал раньше.

-1

Попробуйте использовать это вместо того, чтобы:

System.loadLibrary("tttt"); 
+0

Все еще получаю, что 'java.lang.UnsatisfiedLinkError', спасибо за попытку Dizzy. – Totem

+0

Я не думаю, что это неверный ответ, хотя он не разрешил проблему Тотема. – Dizzy

+0

Чтобы найти зависимые библиотеки tttt.dll, вам придется использовать Dependency Viewer (который можно загрузить). Другое дело: надеюсь, что вы используете 64-битный JDK (не могли спросить об этом на оригинальной записи). – Dizzy

0

Дает абсолютный путь к файлу

try { 
    System.load("C:/myapplication/application.dll"); 
} catch (UnsatisfiedLinkError e) { 
    System.err.println("Native code library failed to load.\n" + e); 
    System.exit(1); 
} 
} 
3

Первой проблемой было то, что она не могла найти dll, потому что она не была в пути.

Вторая проблема заключается в том, что она не может найти зависимости от используемой библиотеки dll. Ваш выбор, казалось бы

  1. Скопировать все зависимые библиотеки к месту
  2. длл Выполнить код из исходного местоположения длл.
+0

Прочтите мое сообщение, о том, что я уже пробовал. – Totem

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