10

Javaで署名されたアプレットからポータブルデバイスを読み取ろうとしています。ポータブルデバイスにアクセスするためにhttp://code.google.com/p/jmtp/w/listでjmtpライブラリを見つけました が、エラーが発生する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();

    }
}

何が問題なのか教えてください

4

3 に答える 3

25

最後に、解決策を見つけました。ネイティブライブラリを含めるには、NetBeansに次の手順を追加する必要があります。

     ==>プロジェクトを右クリックします
     ==>プロパティ
     ==>実行をクリックします
     ==> VMオプション:-Djava.library.path = "C:\DLLが存在するディレクトリ"
     ==>わかりました
    

于 2012-10-10T09:00:34.130 に答える
6

次の行を使用して、プログラム内からライブラリをロードすることもできます。

System.loadLibrary("jmtp")

ファイルを含むフォルダーをjmtp.dllJavaプロジェクトのすぐ下に配置します。

または、これを試してみましたが、機能します。

System.setProperty( "java.library.path", "libs" );

一方、「libs」はdllを含むフォルダーであり、javaプロジェクトフォルダーの直下に配置されます。

jmtp.dll64ビット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でプログラムを実行する必要があります。

于 2013-10-26T01:03:24.410 に答える
1

しばらくこれに苦労した後、私は問題の実用的な解決策を見つけました。

コード内で使用して、システムSystem.out.println(System.getProperty("java.library.path")); の実際の値を調べましたjava.library.path。これは、少なくとも%PATH%システム変数とユーザー環境変数の変数を連結したものです。したがって、必要なのは、ライブラリの場所をそれらのいずれかに追加することだけで、問題は解決しました。

于 2016-06-17T14:51:21.433 に答える