我正在嘗試爲斐濟/ ImageJ開發一個依賴本機庫(JNI)的插件。 JNI庫本身取決於libtiff
和fftw
。在OSX和Linux上,我使用類NativeUtils,一切正常。將JNI庫封裝在jar文件中
在windows上,我在CMake
包中包含了libtiff
和fftw
的二進制版本,並設法將JNI庫與那些(靜態地動態地)鏈接起來。但是,生成的JNI模塊不包含libtiff
或fftw
,並且當我嘗試加載帶有NativeUtils.loadLibraryFromJar
的JNI庫時出現錯誤。當我在.jar
中包含從屬.dll
時也會出現這種情況,因爲它們不是由NativeUtils
提取的。
下面是相關線路中CMakeLists.txt
:
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})
你將如何確保所有的依賴適當地包括在罐子並加載?
不是完整的解決方案,但是您是否閱讀過ImageJ文檔的[使用本機庫開發](https://imagej.net/Developing_using_native_libraries)頁面?你有沒有嘗試將你的本地庫放入'$ IJ_ROOT/lib/'而不是嵌入到JAR文件中? –
ctrueden
我曾考慮過這個問題,但它讓最終用戶的安裝變得更加複雜。如果@mko提出的解決方案適用於我,我會盡量在jar中包含所有內容。 – hpixel
我不明白你對安裝的關注。如果您使用[更新站點](https://imagej.net/Update_Sites),您可以通過點擊一端上的按鈕將所有需要的文件發送給用戶,他們也會自動收到更新。 – ctrueden