4

(これは私が犯している明らかな間違いかもしれませんが、6 時間経っても機能しませんでした。)

Eclipse プロジェクトで sigar.jar を使用して CPU 情報を取得しようとしています (今のところ sigar API をテストしているだけです)。

問題なく日食で実行されます。

  • Eclipseで機能させたのは、dllをsigar.jarと同じフォルダーに配置することでした
  • ビルド パス設定ダイアログで「ネイティブ コード プロパティ」として dll へのパスを追加しても効果がないことをテストしました。
  • 実行構成に vm 引数を追加しても効果はありません。
  • これらの2つの場所に2つの偽のパスを配置してテストしましたが、sigar.jarと同じフォルダーにdllがある限り... Eclipseでうまく動作します。

問題は、プロジェクトの実行可能な .jar ファイルをエクスポートしようとしたときです。私は2つのことを試しました:

  • Bundle-NativeCode: libs/sigar-amd64-winnt.dll で MANIFEST.MF ファイルを変更しました (ここでは、パスはプロジェクト フォルダーからの相対パスであると想定しています) --> 成功しません:
 main starting!! no sigar-amd64-winnt.dll in java.library.path
 org.hyperic.sigar.SigarException: no sigar-amd64-winnt.dll in
 java.library.path
         at org.hyperic.sigar.Sigar.loadLibrary(Sigar.java:172)
         at org.hyperic.sigar.Sigar.<clinit>(Sigar.java:100)
         at CpuData.main(CpuData.java:59) 
 cpudata(sigar s) starting!!! cpuInfo() starting!!! 
 Exception in thread
 "main" java.lang.UnsatisfiedLinkError:
 org.hyperic.sigar.Sigar.getCpuInfoList()[Lorg/hyperic/sigar/C puInfo;
         at org.hyperic.sigar.Sigar.getCpuInfoList(Native Method)
         at CpuData.cpuInfo(CpuData.java:103)
         at CpuData.<init>(CpuData.java:29)
         at CpuData.main(CpuData.java:59)
  • 次に、.dll を project.jar と同じフォルダーに配置し、コマンド ラインで使用することにしました: java -Djava.library.path=./native/ -jar C:\cpu_usage_log\cpu3.jar m ここでは、パスが project.jar を含むフォルダーからの相対パスであると仮定します) ...しかし、やはり成功しません:

エラー: メイン クラス .library.path=..native を見つけたり読み込んだりすることができません

( -Djava.library.path=./path/ の後に2番目の引数としてメインクラス名を指定する必要があると思いましたが、その想定される「メインクラス」名、またはそれを行うWeb上の例が見つかりませんそのようなクラスを指定する ....dll 内のメイン クラスですか?)

この時点で他に何を試すべきか本当にわかりません。私はこれらの2つの解決策が他の人のために働いたことを読みました.他の投稿を読んだときに見逃した、または理解できなかったことが明らかであり、見つけられない可能性があると想像するため、さらにイライラします(対処するのは初めてです) Java プロジェクトのネイティブ dll を使用)。

4

1 に答える 1

2

私にとっては、Java がライブラリをロードする方法を変更することが常に最善でした。

通常System.loadLibrary("mylib");、ライブラリ パス上のライブラリを検索する を呼び出します。

私見では、絶対パスを使用してライブラリをロードする方がはるかに優れています。これにより、プログラムにカスタム検索ロジックを実装できます。

// Extends the name to mylib.so or mylib.dll
mylibname = System.mapLibraryName("mylib"); 

// Load the library via its absolute path
System.load(new File(path, mylibname).getAbsolutePath());

各ライブラリは 1 回しかロードできないことに注意してください。したがって、上記のようにライブラリをロードするSystem.loadLibrary("mylib");と、ライブラリが既にロードされているため、その後の の呼び出しは無視されます。

于 2013-03-22T14:39:43.230 に答える