我正在尝试为依赖本机库(JNI)的斐济/ ImageJ开发一个插件。
JNI库本身取决于libtiff
和fftw
。在OSX和Linux上,我使用类NativeUtils,一切正常。
在Windows上,我在libtiff
包中包含了fftw
和CMake
的二进制版本,并设法将JNI库链接到那些(静态动态)。但是,生成的JNI模块不包括libtiff
或fftw
,当我尝试使用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中并加载?
答案 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玩得开心!