0

私は、JNA を介してロードされた C++ 共有オブジェクトを使用して、C++ で記述したカスタム ファイル読み取り関数を呼び出す Scala プログラムを作成していますが、Java/Scala のコピーも維持したくありません。プログラムは Linux 互換である必要があります。

私の質問は、共有オブジェクトがプログラムで利用可能であることを確認する適切な方法は何ですか? ユーザーが共有オブジェクトを LD_LIBRARY_PATH に追加するのを忘れた場合、そのオブジェクトからいくつかの機能を使用しようとすると、GUI がクラッシュします。共有オブジェクトが利用可能であることを確認するために、起動時にチェックを行いたいと思います。読み取りを試みてからエラーをキャッチすることはできますが、それにはファイルから読み取る必要があり、適切とは思えません。それを行う方法。

何か案は?どうもありがとう。

4

2 に答える 2

2

JNAを介してロードしている場合、ライブラリが見つからないか、依存関係がないためにライブラリをロードできない場合は、JNAに依存してUnsatisfiedLinkErrorをスローできます。

System.loadLibrarySystem.load依存しますjava.library.path。これは、多かれ少なかれ初期化されLD_LIBRARY_PATH、JNAとはまったく同じではありませんjna.library.path(JNAは、その変数を介して動的に指示され、より多くの場所を検索できます)。

于 2012-09-21T11:05:50.927 に答える
1

(JNA JARラッピング機能を使用する代わりに)パスに外部ライブラリを持っている人に依存している場合は、System.loadLibraryを使用して簡単に確認できます。

~ $ cat x.c
int answer() { return 42; }
~ $ gcc -shared -fPIC -o libx.so x.c
~ $ scala
Welcome to Scala version 2.9.2 (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_21).
Type in expressions to have them evaluated.
Type :help for more information.

scala> System.loadLibrary("x")

scala> System.loadLibrary("y")
java.lang.UnsatisfiedLinkError: no y in java.library.path
        at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1734)
        at java.lang.Runtime.loadLibrary0(Runtime.java:823)
[...]
于 2012-09-21T09:42:43.613 に答える