COBOL2002 ユーザーズガイド


19.3.3 Java言語とCOBOL言語のデータ型の対応

〈この項の構成〉

(1) COBOL言語で使用できるJava言語のデータ型と対応

COBOL言語で使用できるJava言語のデータ型と,対応するCOBOLのデータ項目の型,およびC言語でのデータ型を,次に示します。

Javaの型

対応するCOBOLのデータ項目の型

対応するC言語のデータ型

jboolean

-Bin1Byte

指定あり

符号なし2進項目

(1〜2けた)

9(1) COMP 〜 9(2) COMP

Boolean

-Bin1Byte

指定なし

符号なし2進項目

(1〜2けた)

9(1) COMP-X 〜 9(2) COMP-X

jbyte

-Bin1Byte

指定あり

符号付き2進項目

(1〜2けた)

S9(1) COMP 〜 S9(2) COMP

byte

jchar

-Bin1Byte

指定あり

符号なし2進項目

(3〜4けた)

9(3) COMP 〜 9(4) COMP

char

-Bin1Byte

指定なし

符号なし2進項目

(1〜4けた)

9(1) COMP 〜 9(4) COMP

符号なし2進項目

(3〜4けた)

9(3) COMP-X 〜 9(4) COMP-X

jshort

-Bin1Byte

指定あり

符号付き2進項目

(3〜4けた)

S9(3) COMP 〜 S9(4) COMP

short

-Bin1Byte

指定なし

符号付き2進項目

(1〜4けた)

S9(1) COMP 〜 S9(4) COMP

jint

符号付き2進項目

(5〜9けた)

S9(5) COMP 〜 S9(9) COMP

int

jlong

符号付き2進項目

(10〜18けた)

S9(10) COMP 〜 S9(18) COMP

_int64

jfloat

単精度内部浮動小数点数字項目

COMP-1

float

jdouble

倍精度内部浮動小数点数字項目

COMP-2

double

注※

実際の値は以下の二つだけになります。

0:Java言語でのfalseを意味する

1:Java言語でのtrueを意味する

また,次に示すJava言語でのデータ型は,COBOL言語で使用できません。

ただし文字列型は,C言語のサポート関数を作成すると,COBOLで使用できます。詳細は,「19.3.3 Java言語とCOBOL言語のデータ型の対応」の「(2) Javaの文字列型をCOBOLで使用する方法」を参照してください。

(2) Javaの文字列型をCOBOLで使用する方法

Javaの言語仕様上,文字列型はすべて Stringクラスのオブジェクトとなっています。そのため,JavaプログラムからCOBOLプログラムを呼び出した時,引数に文字列型を指定しても,COBOLプログラムでは文字列の内容を参照できません。

しかし,Java言語の他言語インタフェース機能(Java Native Interface)には,Java言語のStringオブジェクトをC言語の文字列型に変換できる機能があります。StringオブジェクトをC言語の文字列型に変換するCプログラムを作成し,COBOLプログラムから呼び出すと,COBOLプログラムでJava言語の文字列型を参照できます。

Cプログラムのサポート関数「jstring2string」を記述したCソースファイル「util.c」の例を次に示します。

サポート関数を定義するCソースファイル(util.c)
#include <windows.h>
#include <jni.h>    
             /* JDKで使用できるインクルードファイル */
/* Java言語のStringオブジェクトをC言語の
   文字列に変換する */
/* この関数はC言語の文字列での文字列長を返す */
int jstring2string
(char *str,    /* C言語の文字列を格納するバッファ */
 int max,      /* 格納するバッファのサイズ      */
 JNIEnv *env,  /* Java実行時環境のポインタ     */
 jstring jstr) /* Java言語のString文字列      */
{
  const jchar *wstr;
  /* JavaNativeInterfaceの文字列変換機能を利用する */
  /* ただし,この機能によって変換された文字列は
     Unicodeである */
  wstr = (*env)->GetStringChars (env, jstr, 0);
  /* Unicode文字列をシフトJIS文字列に変換する */
  WideCharToMultiByte
      (CP_ACP, 0, wstr, -1, str, max, NULL, NULL);
  /* 変換後の文字列の長さを返す */
  return strlen (str);
}

上記のCプログラム(util.c)のサポート関数を呼び出すCOBOLプログラムの例を次に示します。このプログラムが,Javaプログラムから呼び出されるとき,引数には文字列が代入されます。

       IDENTIFICATION DIVISION.
       PROGRAM-ID. 'Java_DLL_func'.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
         01 len PIC S9(9) USAGE COMP.
         01 max PIC S9(9) USAGE COMP VALUE 1024.
         01 str.
           02 FILLER PIC X OCCURS 1024.
       LINKAGE SECTION.
         01 JNIEnv  ADDRESS.
         01 jobject ADDRESS.
         01 jstr    ADDRESS.
       PROCEDURE DIVISION USING BY VALUE 
                              JNIEnv jobject jstr.
           CALL 'jstring2string' USING str
                          BY VALUE max JNIEnv jstr
                          RETURNING len.
           DISPLAY 'len: ' len.
           DISPLAY 'str: ' str(1:len).
           EXIT PROGRAM.
       END PROGRAM 'Java_DLL_func'.