【问题标题】:Including Native Library in Netbeans在 Netbeans 中包含本机库
【发布时间】:2012-09-29 16:41:51
【问题描述】:

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

线程“主”java.lang.UnsatisfiedLinkError 中的异常: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.(PortableDeviceManagerImplWin32.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();

    }
}

请告诉我有什么问题

【问题讨论】:

  • 您也可以直接从源存档中附加的 bat 文件中复制和粘贴参数。

标签: java netbeans-7 unsatisfiedlinkerror java.library.path wpd


【解决方案1】:

在为此苦苦挣扎了一段时间后,我找到了解决该问题的有效方法。

我用System.out.println(System.getProperty("java.library.path")); 在我的代码中找出java.library.path 在我的系统上的实际值。它至少是系统和用户环境变量的%PATH% 变量的串联。所以我需要做的就是将我的库的位置添加到其中的任何一个中,问题就消失了。

【讨论】:

    【解决方案2】:

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

    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 上运行该程序才能使其正常工作。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 这对我在 Netbeans 中运行项目很有用,但是一旦构建了 jar,同样的错误又回来了。所以从长远来看它没有帮助。
      • 对我有用,路径中不要包含 dll,只包含它所在的目录。
      • 一旦构建了 outpur jar,我们如何才能拥有这个 dll/设置?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多