2016-07-04 101 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链接选项。