2017-09-19 8 views
1

実行時にJNIライブラリを読み込もうとしたときに私の顧客のコンピュータで異常な動作が発生しました。Java System.load(libName)が間違ったlib名を探します

System.load("libtestlibrary.so") 

でライブラリをロードしようとすると、私は与えられたライブラリ名が(誤って)「LIB」を接頭辞と.soが「接尾辞ているように思え

liblibtestlibrary.so.so: cannot open shared object file: No such file or directory 

を取得私たちの図書館は見つかりませんでした。

これは、1台のマシン(AIX 6)でのみ発生します。私はまったく同じJREを使用して私たち自身のAIX 6ボックスでこの動作を再現することができなかったので、これは顧客マシンのいくつかのOS設定によって引き起こされたと推測しています。

これを無効にする方法はありますか?

+2

'System.load("/fullpath/libtestlibrary.so ")'または 'System.loadLibrary(" testlibrary ")'を試してください。後者は、プロパティ 'java.library.path'を設定することと組み合わされました。 –

+0

注:ユーティリティ 'truss(1)'を使用して、オプション '-f'を指定してデバッグしてください。 –

+0

問題はパスではなく、ライブラリは現在のディレクトリにあります。問題は、ライブラリ名に "lib"という接頭辞を付け、 ".so"で接尾辞を付けることによって、ライブラリ名を変更することです。私は 'System.load(" testlibrary ")'を使ってライブラリをロードできると理解していますが、この場合、他のすべてのプラットフォームでコードが失敗します。 'System.loadLibrary(" testlibrary ")'は、私がドキュメンテーションを理解している限り、ネイティブライブラリに使用するべきです。 –

答えて

0

次のいずれかを使用することができます:

System.loadLibrary("libraryname"); 

それが適切にシステム固有の表記に展開されます。または、次のように使用できます。

System.load("you_can_have_anything_you_like_here") 

2番目のケースでは、ファイルの適切な場所を指すだけです。クロスシステム開発をお探しの場合は、ネイティブコードをJAR内にパッケージングすることができます。また

https://github.com/mkowsiak/jnicookbook/tree/master/recipeNo031

JARファイルからライブラリが取られたサンプルコードについてはこちらを見てみましょう、他のライブラリが LD_LIBRARY_PATHで利用可能であることを確認してください。 java.library.pathは "最初の"ネイティブlibにのみ有効です。あなたのコードが他のいくつかの共有ライブラリを使用している場合は、rpathを使ってコンパイルするか、ライブラリがシステム全体に見えるようにする必要があります。

は、さらに別のアプローチは、スタブを経由して行くことです。その場合は http://jnicookbook.owsiak.org/recipe-No-018/

は、あなたが好きなようにライブラリをロードし、あなたが(例えば、オンザフライでネイティブコードを変更する)のようなものは何でもすることができます。

関連する問題