2016-10-26 4 views
0

JNIを使​​用してC++ライブラリに基づいてJava実装を作成したいとします。残念ながら、私はjavaで共有ライブラリを使用したい場合、それは見つけることができません。この共有ライブラリの問題は、別の共有ライブラリにリンクすることです。私は2つの異なるケースがあります(しかし、使用すべきではありません)。Javaで共有ライブラリをロードする際の問題

Ana libは常に静的でなければなりません。 Claraのlibは常に共有する必要があります。これは、Bobのlibが静的な場合に機能しますが、共有する必要があり、AnaとClaraを含める必要があります。

ケース1(正しく動作し、正しいjava.library.pathにロードできます)。

sharedlibJava.soリンク:staticlibAna.a staticlibBob.a sharedlibClara.so

ケース2(java.library.pathには正しいであっても、それがロードできないため、動作しません)。 sharedlibBob.soリンク:staticlibAna.aとsharedlibClara.so(基本的なC++実装をテストし、それが問題なく動作します)

sharedlibJava.soリンク:sharedlibBob.so(Javaの実装は、この新しい共有ライブラリを使用して利用可能であるべきです)。

問題は、ライブラリーをロードしようとすると、正しいjava.library.pathで見つからなくてもそこにあることです。

この問題に関するフィードバックは本当にありがたいです。

答えて

0

すべてのパスの場所をLD_LIBRARY_PATHに設定します。あるいは、-Djava.library.pathに入れてください。

コードを正しくコンパイルしていれば、共有ライブラリにアクセスする際に問題が発生するとは思わないでしょう。

あなたが共有ライブラリとして一つのコードをコンパイルして、共有ライブラリと他のコードをリンクすることによって、それを参照する場合は、それはあなたが渡すことによって、コードを呼び出すことができる必要があり、

cc -g -shared -fpic c/recipeNo023_AnotherFunction.c -o lib/libAnotherFunction.$(EXT) 
cc -g -shared -fpic -I${JAVA_HOME}/include -I${JAVA_HOME}/include/$(ARCH) c/recipeNo023_HelloWorld.c -L./lib -lAnotherFunction -o lib/libHelloWorld.$(EXT) 

そして、うまく動作するはずです完全なサンプルコードについては-Djava.library.path

java -Djava.library.path=:./lib -cp target recipeNo023.HelloWorld 
library: :./lib 
Hello world! 
Hello from another function! 

内部のlib場所、ここで見てみましょう:

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

関連する問題