JavaランタイムでのLinux .soファイルのロード

Loading a Linux .so File at Java Runtime


質問 written by c12 @2011-11-08 23:50:49Z

: 6 : 4 : 11

Javaで実行時にlinux .soファイルをロードしようとしていますが、UnsatisfiedLinkErrorが発生しています。 Test.classから以下のJavaメインを実行するときに、-Djava.library.path = / Users / tom / codebase / jni / dist VM引数を渡します。 libSample.soファイルは/ Users / tom / codebase / jni / distディレクトリにあります。 何か案は? ありがとう!

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/libSample.soの例外に役立つ場合、以下の結果が得られました。 :適切な画像が見つかりません。 見つかりました:/Users/tom/codebase/jni/dist/libCiscoEnergyWiseJni.so:不明なファイルタイプ、最初の8バイト:0x7F 0x45 0x4C 0x46 0x01 0x01 0x01 0x00

コメント 1

ライブラリはlibCiscoEnergyWiseJniと呼ばれる別のライブラリに依存していますか?

written by -laher @2011-11-08 22:58:20Z

コメント 2

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

written by -laher @2011-11-08 22:59:58Z

コメント 3

申し訳ありませんが、それはタイプミスでした...今修正されました

written by c12 @2011-11-08 23:03:56Z

コメント 4

私はまったく同じ問題に直面しています。解決策を見つけることができましたか?

written by -Abhinav @2012-08-31 05:49:30Z

コメント 5

以下で確認した回答を参照してください

written by 。– c12 @2012-09-05 16:36:29Z

回答 1 written by David Z @2011-11-08 23:21:29Z
10

Linuxのライブラリは、多くの場合libXXX.soというパターンで名前が付けられており、Javaはその規則に従っていると思います。 そのため、 System.loadLibrary("Sample")libSample.so探している可能性があります。 これを検証するには、クイックテストプログラムを作成してSystem.mapLibraryNameを呼び出し、出力を確認します。

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

コメント 1

Davidの回答に感謝します。ファイル名は実際にはlibSample.soなので、最初の質問を編集しました...混乱のためごめんなさい-c12

written by @2011-11-08 23:32:16Z

コメント 2

(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

written by c12 @2011-11-08 23:38:08Z

コメント 3

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

written by デビッドZ @2011-11-08 23:39:15Z

回答 2 written by Tom van der Woerdt @2011-12-28 10:44:06Z
1

使用してみてください

Runtime.getRuntime().load(resource);
回答 3 written by Deepak Dickson @2016-10-27 07:08:21Z
1

Linuxで同じ問題に直面し、 LD_LIBRARY_PATH変数を設定することで解決しました

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

お役に立てれば

回答 4 written by quetzalcoatl @2014-11-05 10:26:54Z
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);
        }
    }
}