2016-07-04 10 views
2

JNIを使​​用して既存のCOBOLアプリケーションを呼び出そうとしています。 COBOLのアプリケーション構造は以下の通りです。オープンなcobol dllを含むjniコール

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

既存のCOBOLアプリケーションは、いくつかの静的と呼ばれるサブプログラム(COBOL)と多くの動的(COBOL)のものが含まれます。

アプリケーションのJni呼び出しは正常ですが、COBOL動的サブモジュールを見つけて呼び出すことができませんでした。以下のように(JNI用)

変更されたアプリケーションの構造は次のとおりです。

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

は私がCALL前COB_LIBRARY_PATHとLD_LIBRARY_PATH環境変数を確認し、それらは罰金のようです。

ケースダイナミックモジュールに次のエラーメッセージがあります。

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

私はLinuxで64ビット、1.1.0を使用します。 gccはcobcコマンドのc出力を使用してバイナリを作成するために使用されます

+0

LD_LIBRARY_PATHは、libcobとそれが必要とするso-fileだけを指し示す必要があります。 COB_LIBRARY_PATHにはすべてのCOBOLモジュールが含まれている必要があります。 どのように見えますか? Javaランタイムとlibcobとアプリケーションファイルの両方に同じアーキテクチャ(32/64ビット)を使用してもよろしいですか?あなたが得た正確なエラーは何ですか? OpenCOBOLのどのバージョンを使用していますか? –

+0

エラーメッセージとOCバージョンを使用して質問を更新しました。私は呼び出し後に例外で使用したので、エラーは表示されませんでした。 – cobp

+0

OK、問題は呼び出されたモジュールではなく、libcob自体のシンボルの1つにあります。 'export LD_PRELOAD =/path/to/libcob.so'でモジュールのロードを強制するのに役立ちますか? BTW: "linux"はあまり具体的ではありません;-)サイド質問:[ごめんなさい。] [GnuCOBOL 2.0 devスナップショット](https://sourceforge.net/projects/open-cobol/)ファイル/ gnu-cobol/2.0/gnu-cobol-2.0_nightly_r624.tar.gz /ダウンロード)もありますか? –

答えて

1

この問題は、-lcobリンケージオプション(gccを使用する場合)を正しく指定することで解決できます。バイナリの作成に使用されたgccコマンドには既にオプションが含まれていましたが、実際には無効だったターゲットとソースファイルの間に誤って配置されていました。 JNIを呼び出さずにdllを実行すると、何らかの理由で-lcobオプションは必要ありませんが、JNI呼び出しからは-lcobリンケージオプションが必要です。

関連する問題