将 JNI 库封装在 jar 文件中

Encapsulating a JNI library inside a jar file

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

在 windows 上,我在 CMake 包中包含了 libtifffftw 的二进制版本,并设法 link 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})

您如何确保所有依赖项都正确包含在 jar 中并加载?

如果不首先解压缩 JAR,则无法从 JAR 中加载库。

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

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

更新

好吧,在那种情况下,当您需要打包更多库并且想要正确解析位置时,您需要稍微玩一下运行时环境。

看这里:

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

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

玩得开心 JNI!