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.cblccbl2002 -Dll※ -DllInit -MainNotCBL -Bin1Byte
-OutputFile DLLfunc.dll DLLfunc.cblCOBOLプログラムの初期化・終了処理をするサービスルーチン(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.