包括Netbeans中的Native Library



我正在尝试从java签名的小程序中读取便携式设备。。。。我在上找到了jmtp库http://code.google.com/p/jmtp/w/list访问便携式设备,但当我在netbeans中运行它时,会出现错误

线程"main"java.lang.UnsisfiedLinkError中出现异常:java.library.path中没有jmtp位于java.lang.ClassLoader.loadLibrary(ClassLoader.java:1860)位于java.lang.Runtime.loadLibrary0(Runtime.java:845)位于java.lang.System.loadLibrary(System.java:1084)在jmtp。PortableDeviceManagerImplWin32.(PortableDeviceManager ImplWin2.java:38)在jmtp。PortableDeviceManager。(PortableDeviceManager.java:34)在jmtp。Jmtp.main(Jmtp.java:23)Java结果:1

我搜索了一下,发现我必须在jmtp项目中包含.dll文件作为本地库。。。我右键单击项目并导航到属性,然后选择"运行"并选择VM选项作为

-Djava.library.path="c:\jmtp\native\windows">
,并将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();
}
}

请告诉我出了什么问题

最后我找到了解决方案,为了包含原生库,我们需要在netbeans中添加以下步骤

===>右键单击项目===>属性===>点击RUN===>VM选项:-Djava.library.path="C:\ Dll所在的目录"===>好

您也可以使用以下行从程序中加载库:

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%变量和用户环境变量的串联。所以我所需要的就是将我的库的位置添加到其中任何一个库中,问题就消失了。

最新更新