0

アプリケーションでシステム情報を検索する必要があり、そのために次の 2 つのネイティブ ライブラリ ファイルがあります: SystemManagerLinux.soSystemManagerWin32.dll.

Java GUI に関する情報を表示するには、Java コードでこれらのライブラリ ファイルを使用する必要があります。私はこれらのファイルを次の場所に配置しました:C:\Users\surjit\Documents\NetBeansProjects\SampleMonitorそして、以下に示すように、実行オプションで netbeans ide の vm 引数として与えます:

-Djava.library.path="C:\Users\surjit\Documents\NetBeansProjects\SampleMonitor"

コードのようにライブラリを呼び出します:

if (os.startsWith("Linux"))
   loadTmpLibrary("SystemManagerLinux.so", "libSML", ".so");
else if (os.startsWith("Windows")) {
   loadTmpLibrary("SystemManagerWin32.dll", "SMW", ".dll");

しかし、アプリケーションを実行していると、次のエラーが発生します。

Exception in thread "main" java.lang.UnsatisfiedLinkError:     SystemManagerWin32.fetchProcessIDs([I)I
    at SystemManagerWin32.fetchProcessIDs(Native Method)
    at SystemMonitor.refreshPidList(SystemMonitor.java:168)
    at SystemMonitor.<init>(SystemMonitor.java:383)
    at SystemMonitor.main(SystemMonitor.java:494)
Exception in thread "Thread-2" java.lang.UnsatisfiedLinkError:    SystemManagerWin32.fetchSystemMemoryStatus(LSystemMemoryStatus;)Z
    at SystemManagerWin32.fetchSystemMemoryStatus(Native Method)
    at SystemMonitor.run(SystemMonitor.java:410)
    at java.lang.Thread.run(Thread.java:722)

解決策を提案してください。ありがとう

4

1 に答える 1

0

問題は、呼び出しようとしているネイティブ メソッドが DLL に存在しないことであり、DLL の読み込みに失敗したことではないようです。

loadTmpLibrary呼び出しが効果的に実行されると仮定System.loadLibrary()すると、ネイティブ メソッドが適切に宣言されていることを確認する必要があります。通常javah、正確なヘッダーを取得するには、ネイティブ宣言を含む Java ソースを呼び出すだけで十分です。その出力を、現在コンパイルしているものと比較してください。

于 2012-11-17T14:52:56.717 に答える