読者です 読者をやめる 読者になる 読者になる

「COBOL」「Java」OpenCOBOL から Java を呼び出す

OpenCOBOL から Java を呼び出してみたので、その時のメモ。
以下のエントリーと同様にインタフェースには JNI を使います。

・「Java」「COBOLJava から OpenCOBOL を呼び出す - プログラム日記
http://a4dosanddos.hatenablog.com/entry/2013/11/05/014548

[ 環境情報 ]
CentOS 6.2
Java SE 7 Update 21
OpenCOBOL 2.0
GCC 4.4.7

JDK のインストールディレクトリは "/usr/local/java/jdk1.7.0_21/"
OpenCOBOL のインストールディレクトリは "/usr/local/cobol/2.0/"

1. Java プログラムの作成 ( Hello.java )

public class Hello {
  public static void hello() {
    System.out.println("***** Hello World");
  }
}

コンパイルしておく。


2. C プログラムの作成 ( CallJava.c )

#include <stdio.h>
#include "jni.h"

int callJavaMethod(void)
{	
    JNIEnv  *env;
    JavaVM  *jvm;
    int     res;
    jclass  cls;
    jmethodID mid;

    JavaVMOption options[1];
    options[0].optionString = "-Djava.class.path=.";

    JavaVMInitArgs vm_args;
    vm_args.version = JNI_VERSION_1_6;
    vm_args.options = options;
    vm_args.nOptions = 1;

    res = JNI_CreateJavaVM(&jvm, (void **)&env, &vm_args);
    cls = (*env)->FindClass(env, "Hello");
    mid = (*env)->GetStaticMethodID(env, cls, "hello", "()V");
    
    printf("** C start\n");
    (*env)->CallStaticVoidMethod(env, cls, mid, NULL);
    printf("** C end\n");

    (*jvm)->DestroyJavaVM(jvm);
    return 0;
}


3. COBOL プログラムの作成 ( CallJava.cob )

      * Sample COBOL program
       IDENTIFICATION DIVISION.
       PROGRAM-ID. CallJava.
       PROCEDURE DIVISION.
       DISPLAY "COBOL start".
       CALL "callJavaMethod".
       DISPLAY "COBOL end".
       EXIT PROGRAM.


4. コンパイル、および、環境変数 LD_LIBRARY_PATH を設定する

cobc -x CallJava.cob CallJava.c -I /usr/local/java/jdk1.7.0_21/include/ -I /usr/local/java/jdk1.7.0_21/include/linux/ -L /usr/local/java/jdk1.7.0_21/jre/lib/i386/server/ -ljvm
export LD_LIBRARY_PATH=/usr/local/cobol/2.0/lib/:/usr/local/java/jdk1.7.0_21/jre/lib/i386/server/


上記で作業は完了です。生成された "CallJava" を実行して、以下の出力が得られたらひとまず成功。

COBOL start
** C start
***** Hello World
** C end
COBOL end


一応ドキュメント的には、以下の Static COBOL to C とかあたりが参考になるんかと思います。

・OpenCOBOL - B-Wiki - UserManual/2_3
http://www.opencobol.org/modules/bwiki/index.php?cmd=read&page=UserManual%2F2_3


以上です。