2011-11-08 2 views
4

実行時にLinuxの.soファイルをJavaでロードしようとしていますが、UnsatisfiedLinkErrorが表示されています。私はTest.classから以下のjava mainを実行するときに-Djava.library.path =/Users/tom/codebase/jni/dist VM引数を渡します。 libSample.soファイルは/ Users/tom/codebase/jni/distディレクトリにあります。何か案は?ありがとう!JavaランタイムでLinuxの.soファイルを読み込む

public class Test { 

    public static void main(String[] args) { 
     System.out.println(System.getProperty("java.library.path")); 
       //prints /Users/tom/codebase/jni/dist 
     System.loadLibrary("Sample"); 
    } 

} 

VM引数:

-Djava.library.path=/Users/tom/codebase/jni/dist 

例外:

Exception in thread "main" java.lang.UnsatisfiedLinkError: no Sample in java.library.path 
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1758) 
at java.lang.Runtime.loadLibrary0(Runtime.java:823) 
at java.lang.System.loadLibrary(System.java:1045) 
at Test.main(Test.java:9) 

また、私は(は、System.loadを使用して)直接的なアプローチを試みる使用しようと、以下の結果を得ましたこれらがスレッド「main」内の例外を助ける場合java.lang.UnsatisfiedLinkError:/ Users/tom/codebase/jni/dist/libSampl e.so:適切な画像が見つかりません。見つかった:/Users/tom/codebase/jni/dist/libCiscoEnergyWiseJni.so:最初の8バイト:0x7F 0x45 0x4C 0x46 0x01 0x01 0x01 0x00

+0

は、あなたのライブラリが別のライブラリに依存しないことができますlibCiscoEnergyWiseJniと呼ばれる? – laher

+0

(その場合は、/ the/folder/where/its /をjava.library.pathの最後に追加する必要があります) – laher

+0

これは誤字ではありません...固定されました – c12

答えて

8

Linuxのライブラリは多くの場合、パターンlibXXX.soに名前が付けられています。私はJavaがその慣習に従うと信じているだからSystem.loadLibrary("Sample")libSample.soを探している可能性があります。これを確認するには、System.mapLibraryNameに電話して出力を確認する簡単なテストプログラムを作成します。

この問題を解決するには、ライブラリファイルの名前を変更するか、System.loadSystem.loadLibraryではなく)を使用します。これにより、渡されたファイル名で指定されたライブラリがロードされます。変換なしで。しかし、後者の方法はプラットフォーム間で移植できません。

+0

応答Davidに感謝します。ファイル名は実際にはlibSample.soです。私は最初の質問を編集しました...混乱して申し訳ありません。 – c12

+0

直接アプローチ(System.loadを使用)を試みましたが、これらの結果がスレッド "main "java.lang.UnsatisfiedLinkError:/Users/tom/codebase/jni/dist/libSample.so:適切なイメージが見つかりません。見つかった:/Users/tom/codebase/jni/dist/libCiscoEnergyWiseJni.so:最初の8バイト:0x7F 0x45 0x4C 0x46 0x01 0x01 0x01 0x00 – c12

+0

@ c12:他の回答者の質問にその情報を編集することをお勧めします。 –

-1

私は、Linuxで同じ問題に直面し、LD_LIBRARY_PATH変数

export LD_LIBRARY_PATH=<Lib File Path>:$LD_LIBRARY_PATH. 

希望を設定することで解決

Runtime.getRuntime().load(resource); 
-2
public class Demo 
{ 
    static 
    { 
     try 
     { 
      System.load("/home/libsofile.so"); 
     } 
     catch (UnsatisfiedLinkError e) 
     { 
      System.err.println("Native code library failed to load.\n" + e); 
      System.exit(1); 
     } 
    } 
} 
0

使用してみては、この