COBOL2002 ユーザーズガイド
COBOLプログラムを呼び出すJavaプログラムでは,次の三つのJavaソースファイルを作成する必要があります。
public class DLLtest { public static void main (String args[]) { // サービスルーチンを呼び出す // Cプログラムに対応するクラスのインスタンスを生成 DLLcbl2002rt aDLLcbl2002rt = new DLLcbl2002rt (); // 呼び出すCOBOLプログラムに対応する // クラスのインスタンスを生成 DLLclass aDLLclass = new DLLclass (); // COBOLプログラムの実行環境初期化処理をする // サービスルーチンを呼び出す aDLLcbl2002rt.cblgint (); // COBOLプログラムの呼び出し int result = aDLLclass.DLLcobol (10, 20); // COBOLプログラムの実行環境終了処理をする // サービスルーチンを呼び出す aDLLcbl2002rt.cblend (); // Javaプログラムの終了 System.exit (0); } }
class DLLclass { // 呼び出されるCOBOLプログラムに対応する // メソッドプロトタイプを定義する public native int DLLcobol (int arg1, int arg2); // 呼び出されるCOBOLプログラムを含むDLLをロードする static { System.loadLibrary ("DLLfunc"); } }
表20-3 例で仮定している名称
名称 | 意味 |
---|---|
DLLcobol | 呼び出されるCOBOLプログラムに対応するJavaメソッドのメソッド名 |
DLLfunc.dll | 呼び出されるCOBOLプログラムを含むDLLのファイル名 |
DLLclass | 呼び出されるCOBOLプログラムに対応するJavaメソッドを含むJavaプログラム(Javaクラス)のクラス名 |
DLLclass.java | DLLclassを記述したソースファイルのファイル名 |
class DLLcbl2002rt { public native int cblgint (); public native int cblend (); static { System.loadLibrary ("DLLcbl2002rt"); } }
表20-4 例で仮定している名称
名称 | 意味 |
---|---|
DLLcbl2002rt | 呼び出すCプログラムを含むDLLのファイル名 |
DLLcbl2002rt | 「native」指定を持つJavaメソッドとDLLをロードする処理を含むJavaクラスのクラス名 |
DLLcbl2002rt.java | Javaクラス「DLLcbl2002rt」を定義したJavaソースファイルのファイル名 |
作成したJavaソースファイルをコンパイルして,Javaバイトコードファイルを生成します。
次に,(a)で作成したJavaソースファイルのコンパイル指定例を示します。
javac DLLtest.java javac DLLclass.java javac DLLcbl2002rt.java
生成されたJavaバイトコードファイルの中の,他言語プログラムに対応するJavaプログラム(Javaクラス)のJavaバイトコードファイルから,C言語ヘッダファイルを生成します。このヘッダファイルには,「native」指定のあるJavaメソッドに対応するC言語の関数プロトタイプ宣言が含まれています。
サービスルーチンを呼び出すCプログラムは,このヘッダファイルをインクルードする必要があります。このヘッダファイルは,COBOLプログラム作成時にも必要です。
(b)で生成したJavaバイトコードファイル「DLLclass.class」と「DLLcbl2002rt.class」から,C言語ヘッダファイルを生成させる例を次に示します。
javah -jni DLLclass javah -jni DLLcbl2002rt
JNIEXPORT jint JNICALL Java_DLLclass_DLLcobol (JNIEnv *, jobject, jint, jint);
関数の要素 | 内容 |
---|---|
関数名 | Java_DLLclass_DLLcobol |
引数 | 4個 |
関数の戻り値の型 | jint |
Javaプログラムから実際に呼び出されるCOBOLプログラムのソースファイルを作成します。ここで作成するCOBOLプログラムは,次の条件を満たしている必要があります。
Javaプログラムから呼び出されるCOBOLプログラムの,ソースファイル例を次に示します。
IDENTIFICATION DIVISION. PROGRAM-ID. 'Java_DLLclass_DLLcobol'. DATA DIVISION. WORKING-STORAGE SECTION. LINKAGE SECTION. 01 JNIEnv USAGE ADDRESS. …1. 01 jobject USAGE ADDRESS. …1. 01 arg-1 PIC S9(9) USAGE COMP. …2. 01 arg-2 PIC S9(9) USAGE COMP. …2. 01 ret-1 PIC S9(9) USAGE COMP. …3. PROCEDURE DIVISION USING BY VALUE JNIEnv jobject arg-1 arg-2 …4. RETURNING ret-1. *手続き部本体の記述 DISPLAY 'arg-1: ' arg-1. DISPLAY 'arg-2: ' arg-2. COMPUTE ret-1 = arg-1 * arg-2. DISPLAY 'ret-1: ' ret-1. END PROGRAM 'Java_DLLclass_DLLcobol'.
作成したCOBOLソースファイルをコンパイルしてstdcall呼び出し規約(32bit版PC(x86) COBOL2002で有効),またはfastcall呼び出し規約(64bit版PC(x64) COBOL2002で有効)のDLLを生成します。
次に,(a)で例に挙げたソースファイル「DLLfunc.cbl」をコマンドプロンプト上からコンパイルする例を示します。
ccbl2002 -Dll,Stdcall -DllInit -MainNotCBL -Bin1Byte -OutputFile DLLfunc.dll DLLfunc.cbl
ccbl2002 -Dll※ -DllInit -MainNotCBL -Bin1Byte -OutputFile DLLfunc.dll DLLfunc.cbl
COBOLプログラムの初期化・終了処理をするサービスルーチン(CBLGINT/CBLEND)を呼び出すCプログラムを作成します。
作成するCプログラムの関数は,Javaバイトコードファイルから生成したC言語ヘッダファイル内の関数プロトタイプ宣言と同じ名称・型・引数である必要があります。
次に,C言語ヘッダファイル「DLLcbl2002rt.h」に対応するCソースファイルの例「DLLcbl2002rt.c」を示します。
#include <windows.h> #include "DLLcbl2002rt.h" extern int WINAPI CBLGINT(); extern int WINAPI CBLEND(); JNIEXPORT jint JNICALL Java_DLLcbl2002rt_cblgint(JNIEnv *env, jobject obj) { /* サービスルーチンの初期化ルーチンを 呼び出す */ CBLGINT(); } JNIEXPORT jint JNICALL Java_DLLcbl2002rt_cblend(JNIEnv *env, jobject obj) { /* サービスルーチンの終了処理ルーチンを 呼び出す */ CBLEND(); }
作成したCソースファイルをコンパイルし,DLLを生成します。
次に,(a)で作成したCソースファイルをコンパイルする指定例を示します。
cl /LD DLLcbl2002rt.c cbl2k_32.lib
上記の例を実行すると,「DLLcbl2002rt.dll」が生成されます。
Javaプログラムを実行する前に,Javaプログラム以外の他言語プログラムを含むDLLがあるパス名を,環境変数PATHに指定する必要があります。環境変数PATHの指定例を次に示します。
set PATH=d:\users\dll;%PATH%
Javaプログラムの実行は,JDKに付属しているJavaインタプリタを使用して実行する方法と,Javaインタプリタを内蔵したWebブラウザから実行する方法があります。
JDK付属のJavaインタプリタを使用して実行する例を次に示します。この場合,「public」属性と「static」属性を持ち,メソッド名が「main」であるメソッドを含むクラスのクラス名(DLLtest)をJavaインタプリタの引数に指定します。
java DLLtest
All Rights Reserved. Copyright (C) 2013, 2016, Hitachi, Ltd.
All Rights Reserved. Copyright (C) 2002, 2011, Microsoft Corporation.