将 JNI 库封装在 jar 文件中
Encapsulating a JNI library inside a jar file
我正在尝试为 Fiji/ImageJ 开发一个依赖本机库 (JNI) 的插件。
JNI 库本身依赖于 libtiff
和 fftw
。在 OSX 和 Linux 上,我使用 class NativeUtils 并且一切正常。
在 windows 上,我在 CMake
包中包含了 libtiff
和 fftw
的二进制版本,并设法 link 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,则无法从 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!
我正在尝试为 Fiji/ImageJ 开发一个依赖本机库 (JNI) 的插件。
JNI 库本身依赖于 libtiff
和 fftw
。在 OSX 和 Linux 上,我使用 class NativeUtils 并且一切正常。
在 windows 上,我在 CMake
包中包含了 libtiff
和 fftw
的二进制版本,并设法 link 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,则无法从 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!