将JNI库封装在jar文件中
问题描述:
我正在尝试为斐济/ 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})
你将如何确保所有的依赖适当地包括在罐子并加载?
答
无法从JAR内部加载库,而无需首先将其提取出来。
查看完整示例,其中将本地代码嵌入到JAR中并在需要时进行提取。
https://github.com/mkowsiak/jnicookbook/tree/master/recipeNo031
更新
那么,在这种情况下,当你需要更多的打包库和要妥善解决的位置,你需要运行ENV有点玩。
到这里看看:
https://github.com/mkowsiak/jnicookbook/tree/master/recipeNo035
git clone https://github.com/mkowsiak/jnicookbook
cd jnicookbook/recipeNo035
make
make test
与JNI的乐趣!
不是完整的解决方案,但是您是否阅读过ImageJ文档的[使用本机库开发](https://imagej.net/Developing_using_native_libraries)页面?你有没有尝试将你的本地库放入'$ IJ_ROOT/lib/'而不是嵌入到JAR文件中? –
ctrueden
我曾考虑过这个问题,但它让最终用户的安装变得更加复杂。如果@mko提出的解决方案适用于我,我会尽量在jar中包含所有内容。 – hpixel
我不明白你对安装的关注。如果您使用[更新站点](https://imagej.net/Update_Sites),您可以通过点击一端上的按钮将所有需要的文件发送给用户,他们也会自动收到更新。 – ctrueden