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();
}
}
何が問題なのか教えてください
最後に、解決策を見つけました。ネイティブライブラリを含めるには、NetBeansに次の手順を追加する必要があります。
==>プロジェクトを右クリック ==>プロパティ ==> [実行]をクリック ==> VMオプション:-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%
変数を連結したものです。したがって、必要なのは、ライブラリの場所をそれらのいずれかに追加することだけで、問題は解決しました。