web-dev-qa-db-ja.com

Netbeansにネイティブライブラリを含める

Java署名付きアプレットからポータブルデバイスを読み取ろうとしています... http://code.google.com/p/jmtp/w/list からjmtpライブラリを見つけましたポータブルデバイスにアクセスできますが、NetBeansで実行するとエラーが発生します

スレッド "main" Java.lang.UnsatisfiedLinkErrorの例外:Java.lang.ClassLoader.loadLibrary(ClassLoader.Java:1860)
のJava.library.path 
にjmtpがありません。] Java.lang.Runtime.loadLibrary0(Runtime.Java:845)
 at Java.lang.System.loadLibrary(System.Java:1084)
 at jmtp.PortableDeviceManagerImplWin32。(PortableDeviceManagerImplWin32.Java: 38)
 at jmtp.PortableDeviceManager。(PortableDeviceManager.Java:34)
 at jmtp.Jmtp.main(Jmtp.Java:23)
 Java結果:1 
 

検索したところ、jmtpのプロジェクトにネイティブライブラリとして.dllファイルを含める必要があることがわかりました...プロジェクトを右クリックしてプロパティに移動し、[実行]を選択してVMオプションを選択しました。

-Djava.library.path = "c:\ jmtp\native\windows"

しかし、同じエラーが常に表示されます私のコードは

パッケージ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();

    }
}

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

10
Umair Aziz

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

 ==>プロジェクトを右クリック
 ==>プロパティ
 ==> [実行]をクリック
 ==> VMオプション:-Djava.library.path = "C:\ DLLが存在するディレクトリ" 
 ==> OK 
 
24
Umair Aziz

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

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

6
vinayc

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

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

1
Luyanda Masiko