2

この jar ファイル ( http://sourceforge.net/projects/uirt-j/ ) を個人的なプロジェクトで使用したいと考えています。現在、私はEclipseを使用しており、プロジェクト> Javaビルドパス>外部JARを追加してそのjarをインポートしようとしました。

インポート後、そのパッケージのすべてのクラスが Eclipse にリストされているのを確認できますが、この jar には、デバイスとの通信に必要な 2 つの win32 dll ファイルも含まれています。それらをSystem32ディレクトリに追加しようとしましたが、うまくいきません。そのコードを実行すると、次の例外がスローされます。

    Exception in thread "main" java.lang.UnsatisfiedLinkError:
    C:\Windows\System32\util_USBUIRT.dll: Can't find dependent libraries
    at java.lang.ClassLoader$NativeLibrary.load(Native Method)
    at java.lang.ClassLoader.loadLibrary0(Unknown Source)
    at java.lang.ClassLoader.loadLibrary(Unknown Source)
    at java.lang.Runtime.loadLibrary0(Unknown Source)
    at java.lang.System.loadLibrary(Unknown Source)
    at util.USBUIRT.<clinit>(USBUIRT.java:269)
    at Uirt.main(Uirt.java:6)

dependency walkerを使用すると、すべての dll が正しくリンクされ、インポートできることがわかります。

これは、実行しようとしているコード スニペットです。

    import util.USBUIRT;
    public class Uirt {
    public static void main(String[] args) {
        String code = "0000";   
        try {
            USBUIRT.transmitIR(code, 2, 3, 2);
        } catch (Exception e) {
            e.printStackTrace();
        }
      }
    }

その JAR ファイルをスタンドアロンで実行すると、問題なく動作します。現在のセットアップは、Windows 7 64 ビットで実行されます。

4

1 に答える 1

4

上記のjar内のdllは32ビットです。環境はWin7x64です。JVMは32ビットであると想定します。そうでない場合、別のエラーが発生します。つまり、:Can't load IA 32-bit .dll on a AMD 64-bit platformまたは同様のものです。

C:\Windows\SysWOW64ではなくにdllをコピーしてみてくださいC:\Windows\System32。32ビットのdllはに入る必要がありますC:\Windows\SysWOW64。それは私にとってはうまくいきましutil.USBUIRT$NotInitializedExceptionたが、おそらくライブラリが正しくロードされたことを示しています。

ファイルシステムリダイレクターの記事は、SysWOW64vsに光を当てる可能性がありSystem32ます。

編集:java.library.pathを微調整します

コメントで言及されている解決策を使用することもできます。たとえば、dllをにコピーC:\tmpして引数を指定して実行します。

-Djava.library.path="C:\tmp;${env_var:PATH}"

ただし、2つのdllの間には依存関係があるため、にあるC:\tmp必要がありますPATH。それ以外の場合はまだありUnsatisfiedLinkErrorます。手動でロードuuirtdrv.dllすると、次のようになります。

import util.USBUIRT;
public class Uirt {
    static {
        System.loadLibrary("uuirtdrv");
    }

public static void main(String[] args) {
    String code = "0000";   
    try {
        USBUIRT.transmitIR(code, 2, 3, 2);
    } catch (Exception e) {
        e.printStackTrace();
    }
  }
}
于 2012-08-22T22:01:00.117 に答える