0

私は Eclipse に夢中です。外部jarを使用する簡単なテストクラスを書いています。ネイティブ ライブラリ .dll を使用します。Eclipse から実行する場合は、Run コマンドを実行します。ここに私のスタックトレース:

Exception in thread "main" java.lang.UnsatisfiedLinkError: C:\Program Files\YAZ\bin\yaz4j.dll: The specified procedure could not be found
    at java.lang.ClassLoader$NativeLibrary.load(Native Method)
    at java.lang.ClassLoader.loadLibrary1(ClassLoader.java:1939)
    at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1864)
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1854)
    at java.lang.Runtime.loadLibrary0(Runtime.java:845)
    at java.lang.System.loadLibrary(System.java:1084)
    at org.yaz4j.Connection.<clinit>(Connection.java:56)
    at ru.Test.testConnection(Test.java:20)
    at ru.Test.main(Test.java:15)

しかし、このコードをコンソールからこのように実行すると

java -cp "bin;C:\Program Files\YAZ\java\yaz4j.jar" ru.Test

すべてが完璧に機能します!同じコードです。コンソールではどのように機能し、Eclipse では機能しないのですか?

ここで、この参照された jar を Eclipse のプロジェクトにプラグインする方法: ここに画像の説明を入力

4

3 に答える 3

0

プロジェクトでYAZツールキットを使用しようとして、数日間まったく同じ問題に苦しんでいます。問題は、ネイティブ ライブラリがさまざまなテスト コンピューターに正しく読み込まれることでしたが、私の個人用 PC には読み込まれませんでした。

要するに、問題の原因は、JVM が不適切なlibxml2.dllおよびlibxslt.dll依存ライブラリをロードすることです。

IDE から JVM を起動すると、次の場所でネイティブ ライブラリの検索が開始されます。

  1. (jdk_home_dir)\jre\bin. 従属ライブラリ (メインの yaz4j.dll 以外) をロードするときに、他のすべてのテスト コンピューターでは何らかの方法でこの手順がスキップされます。このようにして、テスト コンピューターは間違った dll をロードしません。
  2. (jdk_home_dir)\bin
  3. -Djava.library.path パラメーターを設定すると、このステップでそのディレクトリが検索されます
  4. %SystemRoot%\system32
  5. %SystemRoot%
  6. プロジェクトに設定された作業ディレクトリ (存在する場合)。この手順は、理由は不明ですが、私の個人用 PC ではスキップされますが、他のすべてのテスト コンピューターでは機能します。
  7. パス%

Process Monitorを使用してこれを理解しました。手順 1 と 2 は入れ替えてもよいことに注意してください。

yaz4j.dllという名前の YAZ ツールキットのメイン DLLは、ツールキット内の他の dll (特にlibxml2.dlllibxslt.dll )への二次呼び出しを行います。私のJVMはそれらを(jdk_home)\jre\binディレクトリで見つけます。これらは Java にバンドルされているようで、YAZ ツールキットのものとは明らかに異なります。これは、yaz4j.dll によって呼び出されているプロシージャが、それらの dll 内で見つからなかったことを意味します。このようにして、UnsatisfiedLinkException がスローされます。

私の JVMは、環境 %path% 変数または -Djava.library.path スイッチに関係なく、 (jdk_home)\jre\binでネイティブ ライブラリを常に最初に検索しているようです。そのディレクトリのdllを置き換えると、一部のJVMネイティブ機能が壊れる可能性があるため、お勧めしません。

したがって、実行する必要がある最後のステップは、JVM に正しいlibxml2.dllおよびlibxslt.dllライブラリをロードさせる方法を理解することです。

yaz4.dllを再コンパイルして、名前が変更されたlibxml2.dllおよびlibxslt.dllを指すようにすることが、解決策になる可能性があります。

于 2013-06-08T10:55:29.967 に答える
0

私は同じ問題を抱えていました.JREビルドパスライブラリではなくJDKが必要です

于 2014-01-30T00:34:51.850 に答える