将JNI库封装在jar文件

时间:2017-10-06 15:46:39

标签: cmake java-native-interface imagej

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

在Windows上,我在libtiff包中包含了fftwCMake的二进制版本,并设法将JNI库链接到那些(静态动态)。但是,生成的JNI模块不包括libtifffftw,当我尝试使用NativeUtils.loadLibraryFromJar加载JNI库时,我收到错误。当我在.dll中包含从属.jar时也是如此,因为它们不是由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中并加载?

1 个答案:

答案 0 :(得分:1)

您无法在不首先提取库的情况下从JAR内部加载库。

在这里查看完整示例,其中本机代码嵌入在JAR中并在需要时提取。

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

<强>更新

那么,在这种情况下,当你需要打包更多的lib而你想要正确地解析位置时,你需要稍微运行一下env。

看看这里:

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

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

与JNI玩得开心!