2017-10-06 145 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