Включая нативную библиотеку в Netbeans
Я пытаюсь читать переносимые устройства из подписанного Java-апплета.... Я нашел библиотеку jmtp на http://code.google.com/p/jmtp/w/list чтобы получить доступ к переносным устройствам, но когда я запускаю ее в NetBeans дает ошибку
Исключение в потоке "main" java.lang.UnsatisfiedLinkError: нет jmtp в java.library.path в java.lang.ClassLoader.loadLibrary(ClassLoader.java:1860) at java.lang.Runtime.loadLibrary0(Runtime.java:845) в java.lang.System.loadLibrary(System.java:1084) в jmtp.PortableDeviceManagerImplWin32.(PortableDeviceManagerImplWin32.java:38) в jmtp.PortableDeviceManager.(PortableDeviceManager.java:34) в jmtp.Jmtp.main(Jmtp.java:23) Java Результат: 1
Я искал и обнаружил, что мне нужно включить.dll-файл как родную библиотеку в проект jmtp... Я щелкнул правой кнопкой мыши на проекте и перешел к свойствам, а затем выбрал "Выполнить" и выбранный параметр VM как
-Djava.library.path="C:\jmtp\ родной \ окна"и поместил этот файл jmtp.dll в папку c:\jmtp
Но постоянно появляется одна и та же ошибка, мой код
пакет jmtp;import jmtp.PortableDevice; import jmtp.PortableDeviceManager; import jmtp.PortableDeviceObject; import jmtp.PortableDeviceStorageObject; public class Jmtp { public static void main(String[] args) { PortableDeviceManager manager = new PortableDeviceManager(); PortableDevice device = manager.getDevices()[0]; // Connect to my mp3-player device.open(); System.out.println(device.getModel()); System.out.println("---------------"); // Iterate over deviceObjects for(PortableDeviceObject object : device.getRootObjects()) { // If the object is a storage object if(object instanceof PortableDeviceStorageObject) { PortableDeviceStorageObject storage = (PortableDeviceStorageObject)object; for(PortableDeviceObject o2 : storage.getChildObjects()){ System.out.println(o2.getName()); } } } manager.getDevices()[0].close(); } }
пожалуйста, скажите мне, в чем проблема
3 ответа
Наконец, я нашел решение: чтобы включить нативную библиотеку, нам нужно добавить следующие шаги в netbeans
==> Щелкните правой кнопкой мыши на проекте ==> Свойства ==> Нажмите на RUN ==> Параметры виртуальной машины: -Djava.library.path="C:\ Ваш каталог, где присутствует Dll" ==>Ok
Вы также можете загрузить библиотеку из программы, используя следующую строку:
System.loadLibrary("jmtp")
Поместите папку, содержащую файл jmtp.dll
прямо под проектом Java.
В качестве альтернативы я попробовал это, и это работает:
System.setProperty( "java.library.path", "libs" );
Принимая во внимание, что "libs" - это папка, которая содержит dll и находится прямо под папкой проекта java.
Я заметил, что jmtp.dll
выдает следующее исключение с 64-битным JDK:
Exception in thread "main" java.lang.UnsatisfiedLinkError: libs/jmtp (.\libs/jmtp.dll is not a valid Win32 application. )
at java.lang.ClassLoader.loadLibraryWithPath(ClassLoader.java:1018)
at java.lang.ClassLoader.loadLibraryWithClassLoader(ClassLoader.java:982)
at java.lang.System.loadLibrary(System.java:506)
at podcasts.Transferer.main(Transferer.java:28)
Вам нужно будет запустить программу на 32-битном JDK, чтобы это работало.
Поработав с этим некоторое время, я нашел рабочее решение проблемы.
я использовал System.out.println(System.getProperty("java.library.path"));
в моем коде, чтобы узнать, что фактическое значение для java.library.path
был в моей системе. По крайней мере, это объединение %PATH%
переменная для системных и пользовательских переменных среды. Таким образом, все, что мне было нужно, это добавить расположение моих библиотек в одну из них, и проблема исчезла.