2017-10-06 13 views
1

ネイティブライブラリ(JNI)に依存するFiji/ImageJ用のプラグインを開発しようとしています。 JNIライブラリ自体はlibtifffftwに依存します。 OSXとLinuxでは、私はクラスNativeUtilsを使用し、すべて正常に動作します。 Windows上でjarファイル内でJNIライブラリをカプセル化する

、私はCMakeパッケージでlibtifffftwのバイナリバージョンを含めて(静的、動的の)それらに対してJNIライブラリをリンクするために管理。ただし、結果のJNIモジュールにlibtiffまたはfftwが含まれていないため、NativeUtils.loadLibraryFromJarでJNIライブラリをロードしようとするとエラーが発生します。これは、で抽出されていないため、従属.dll.jarに含める場合も同様です。

add_library(fftw STATIC IMPORTED GLOBAL) 
set_target_properties(fftw PROPERTIES IMPORTED_LOCATION "${libdir}/libfftw3f-3.lib" 
             INTERFACE_INCLUDE_DIRECTORIES "${incdir}") 

SWIG_ADD_LIBRARY(javainterf 
       TYPE MODULE 
       LANGUAGE java 
       SOURCES javainterf.i javainterf.c src1.c) 
SWIG_LINK_LIBRARIES(javainterf libcode1 fftw) 

add_jar(Foo 
     SOURCES ${CMAKE_CURRENT_BINARY_DIR}/java/foo1.java 
     INCLUDE_JARS java/resources/ij-1.51p.jar 
     VERSION ${JAR_VERSION}) 
add_dependencies(Foo javainterf) 
add_custom_command(TARGET Foo POST_BUILD 
    COMMAND "${Java_JAR_EXECUTABLE}" -uf Foo-${JAR_VERSION}.jar 
    -C ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR} ${JNI_LIB_NAME}) 

がどのようにすべての依存関係が適切にjarファイルに含まれてロードされていることを確認します:

ここCMakeLists.txt内の関連する行がありますか?

+0

完全な解決策ではありませんが、ImageJドキュメントの[ネイティブライブラリを使用した開発](https://imagej.net/Developing_using_native_libraries)ページをお読みになりましたか? JARファイルに埋め込む代わりに、あなたのネイティブライブラリを '$ IJ_ROOT/lib/'に置いてみましたか? – ctrueden

+0

私はそれについて考えましたが、エンドユーザーにとってインストールがより複雑になります。 @mkoによって提案された解決策が私のために働くならば、jarファイルの中のすべてを含めて行くつもりです。 – hpixel

+0

インストールに関する懸念がありません。 [更新サイト](https://imagej.net/Update_Sites)を使用している場合は、必要なすべてのファイルをボタンをクリックしてユーザーに送ることができます。また、自動的に更新も受け取ります。 – ctrueden

答えて

0

JARの内部からライブラリを読み込むことはできません。

JARの内部にネイティブコードが埋め込まれた完全なサンプルを見て、必要に応じて抽出します。

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

更新

あなたはより多くのlibsをパックする必要があり、あなたが適切場所を解決したい場合まあ、その場合には、あなたは、ランタイムのenv少しでプレーする必要があります。

はこちらをご覧ください:

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

git clone https://github.com/mkowsiak/jnicookbook 
cd jnicookbook/recipeNo035 
make 
make test 

はJNIを楽しんでいます!

+0

ここでの問題は、いくつかの依存ライブラリがあり、一度に1つしか抽出されないということです。私はすべての依存関係をcmakeと1つのdllにマージする方法を見ていません。 – hpixel

+0

すべてのライブラリを抽出し、System.loadを使用してすべてのライブラリをロードすることができます。結局のところ、それはlibsからロードされたシンボルに関するすべてです。 – mko

+0

私のjniライブラリはいくつかの非jni共有ライブラリに依存しています。彼らはjniではありませんが、私は 'loadlibraryfromjar'でそれらをロードしようとしましたが、うまくいきません:私は非常に同じエラーを受け取ります。 – hpixel

関連する問題