2017-10-06 53 views
1

我正在尝试为斐济/ ImageJ开发一个依赖本机库(JNI)的插件。 JNI库本身取决于libtifffftw。在OSX和Linux上,我使用类NativeUtils,一切正常。将JNI库封装在jar文件中

在windows上,我在CMake包中包含了libtifffftw的二进制版本,并设法将JNI库与那些(静态地动态地)链接起来。但是,生成的JNI模块不包含libtifffftw,并且当我尝试加载带有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}) 

你将如何确保所有的依赖适当地包括在罐子并加载?

+0

不是完整的解决方案,但是您是否阅读过ImageJ文档的[使用本机库开发](https://imagej.net/Developing_using_native_libraries)页面?你有没有尝试将你的本地库放入'$ IJ_ROOT/lib/'而不是嵌入到JAR文件中? – ctrueden

+0

我曾考虑过这个问题,但它让最终用户的安装变得更加复杂。如果@mko提出的解决方案适用于我,我会尽量在jar中包含所有内容。 – hpixel

+0

我不明白你对安装的关注。如果您使用[更新站点](https://imagej.net/Update_Sites),您可以通过点击一端上的按钮将所有需要的文件发送给用户,他们也会自动收到更新。 – ctrueden

回答

0

无法从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的乐趣!

+0

这里的问题是,我有几个依赖库,只有一个被提取。我看不出如何用cmake将所有的依赖关系合并成一个dll。 – hpixel

+0

您可以随时提取所有库并使用System.load加载所有这些库。毕竟,它只是关于从libs加载的符号。 – mko

+0

我的jni库依赖于一些非jni共享库。即使它们不是jni,但我试图用'loadlibraryfromjar'加载它们,但它不起作用:我得到了非常相同的错误。 – hpixel