2016-07-04 105 views
2

我想用JNI調用現有的COBOL應用程序。 COBOL應用程序結構如下。jni打開cobol dll調用

c-wrapper(main)-->COBOLProgram -> several dyn(.so) and static called modules 

現有的COBOL應用程序涉及到幾個靜態調用子程序(COBOL)和許多動態(COBOL)的。

Jni調用應用程序是可以的,但它無法找到並調用COBOL動態子模塊。

(對於JNI)修改後的應用結構如下:

java class --> libjni.so --> appl.so 

我的呼叫之前驗證COB_LIBRARY_PATH和LD_LIBRARY_PATH環境變量,這些似乎是細。

以下錯誤消息得到了case動態模塊。

libcob: ....<module>.so: undefined symbol: cob_save_call_params 

我在Linux上使用64位,1.1.0。 gcc用於使用cobc命令的c輸出創建二進制文件

+0

LD_LIBRARY_PATH只能指向libcob和它所需的so-files。 COB_LIBRARY_PATH應該包含所有COBOL模塊。 它們是什麼樣的? 您確定您對java運行時和libcob以及應用程序文件都使用相同的體系結構(32/64位)嗎?你得到了什麼確切的錯誤?你使用什麼版本的OpenCOBOL? –

+0

使用錯誤消息和OC版本更新了問題。在調用之後我使用異常,所以錯誤沒有顯示。 – cobp

+0

好的,因此問題不在被調用的模塊中,而是在libcob本身的一個符號中。它是否有助於通過'export LD_PRELOAD =/path/to/libcob.so'強制模塊加載(在啓動Java之前必須完成**)? 順便說一句:「linux」不是非常具體;-)側面問題:[抱歉污染問題]這是否發生[GnuCOBOL 2.0開發快照](https://sourceforge.net/projects/open-cobol/ files/gnu-cobol/2.0/gnu-cobol-2.0_nightly_r624.tar.gz/download)呢? –

回答

1

通過正確指定-lcob鏈接選項(使用gcc時)可以解決此問題。用於創建二進制文件的gcc命令已包含該選項,但它被錯誤地放置在目標文件和源文件之間,而該文件沒有生效。執行沒有JNI調用的DLL,不知何故不需要-lcob選項,但是來自JNI調用需要-lcob鏈接選項。