# COBOL und Java



## homer65 (14. Mrz 2011)

Hallo Gemeinde,
ich experimentiere gerade damit ein Java Programm von einem COBOL Programm unter z/OS aus aufzurufen.
Das funktioniert grundsätzlich auch. Allerdings tue ich mich bei der Übergabe von Variablen schwer.
Ein einzelnes Byte läßt sich ohne Probleme von COBOL nach Java und umgekehrt von Java nach COBOL übertragen.
Und bei einfachen Datentypen sieht es auch ok aus.
Aber für praktische Zwecke sollten schon größere Datenblöcke übertragen werden.
Zum Beispiel wäre PIC X(1000) nach byte[1000] und umgekehrt schön.
Habe nur keine Idee wie das zu realisieren ist.
Habt ihr eine Idee?
Aber sagt bitte nicht ich sollte 1000 mal ein einzelnes Byte übertragen.
Gruß Christian


----------



## chalkbag (14. Mrz 2011)

Wie machst du es denn im Moment, ehrlich gesagt hab ich keine Ahnung aber ich fände interessant zu sehen wie das funktioniert.

Nach meiner Vorstellung sollte man das evtl über eine SD mappen können, also eine seq. Datei rüberschieben und dann entsprechend mit der Satzstruktur auslesen?


----------



## homer65 (14. Mrz 2011)

chalkbag hat gesagt.:


> Nach meiner Vorstellung sollte man das evtl über eine SD mappen können, also eine seq. Datei rüberschieben und dann entsprechend mit der Satzstruktur auslesen?



Per SD ist nicht so doll.
Erstens ist es erheblich langsamer als per Memory.
Zweitens ist es auch nicht so flexibel. Per Memory kann ich einen kleinen Teil Daten rüberschieben und in abhängigkeit vom Ergebniss den nächsten Teil und so weiter und so fort. Bei einer Datei muß ich alle Daten auf einmal rüberschieben und habe keine Zwischenergebnisse.


----------



## theodosis (15. Mrz 2011)

Interessant wie du die Brücke zwischen Java und COBOL gemacht hast.

Hast du über shared memory gedacht? Vieleicht Java unterstützt das nicht direct, das könnte aber mit JNI gemacht werden und umgekehrt von COBOL könntest du dasselbe oder ein anderes C programm benutzen um auf dem selben shared memory zuzugreifen.


----------



## Noctarius (15. Mrz 2011)

Es gibt doch jetzt eine Cobol Implementierung für die JVM und die .NET Runtime. Mir fällt nur gerade der Hersteller nicht ein.


----------



## homer65 (16. Mrz 2011)

Noctarius hat gesagt.:


> Es gibt doch jetzt eine Cobol Implementierung für die JVM und die .NET Runtime. Mir fällt nur gerade der Hersteller nicht ein.



Hallo Noctarius,
danke für den Tipp, aber es geht um COBOL unter z/OS. 
Das ist wohl sehr speziell.


----------



## homer65 (16. Mrz 2011)

theodosis hat gesagt.:


> Interessant wie du die Brücke zwischen Java und COBOL gemacht hast.
> Hast du über shared memory gedacht? Vieleicht Java unterstützt das nicht direct, das könnte aber mit JNI gemacht werden und umgekehrt von COBOL könntest du dasselbe oder ein anderes C programm benutzen um auf dem selben shared memory zuzugreifen.



C haben wir leider auch nicht zur Verfügung.


----------



## Noctarius (16. Mrz 2011)

Ja ok das wird wohl nicht funktionieren. Visual COBOL R3 Aber bei Interesse das meinte ich


----------



## DieBeobachter (16. Mrz 2011)

Hallo homer65,

aber der aktuelle "IBM Enterprise COBOL for z/OS"-Compiler (Version 4.2) ist vorhanden ?


----------



## homer65 (16. Mrz 2011)

DieBeobachter hat gesagt.:


> Hallo homer65,
> aber der aktuelle "IBM Enterprise COBOL for z/OS"-Compiler (Version 4.2) ist vorhanden ?



Fast.
Im Moment haben wir "IBM Enterprise COBOL for z/OS  3.4.1".
Aber in Kürze - Anfang April diesen Jahres, also in zwei Wochen - migrieren wir auf "IBM Enterprise COBOL for z/OS 4.2.0".


----------



## DieBeobachter (16. Mrz 2011)

Das macht nichts.

Also:

1)	Lesen im "Programming Guide" (z.B. SC27-1412-03) das Kapitel 31 "Communicating with Java methods" (vor und
             zurück und fluchen).          

2)	Sich mit "Java JNI" befassen.

3)	"Nachschulung" für "Cobol ADDRESS".

4)	Nochmals lesen das Kapitel 31 und dann großes Aha-Erlebnis (Beispiel "processing a Java int array")

5)	Und Lösung schreiben (hier Beispiel für "Cobol ===> Java"):

	Ziel "Java byte array" ===> "Java data type: byte[]" nach "Corresponding COBOL data type: object reference jbyteArray"

	a)	Im "Cobo"l-Programm sich ein "jbyteArray" besorgen mit "CALL NewByteArray"

	b)	Das "jbyteArray" mit Inhalt füllen mit "CALL SetByteArrayRegion" 

	c)	Und dann "INVOKE" "Java"-Methode.

6)          Glückliches Ende


----------



## homer65 (16. Mrz 2011)

zu 1: Joh, habe ich schon, insbesondere das "fluchen" klappt ganz gut. 
Das erste Problem ist direkt auf der ersten Seite.
Wo finde ich denn das JNI Copy Buch? 
Habe schon gesucht und gesucht, ist aber nicht zu finden.


----------



## DieBeobachter (16. Mrz 2011)

Hallo homer65,

vermutlich unter "/usr/lpp/cobol/include/JNI.cpy".

Die LKED-Karte für die Cobol-UP-DLL dann unter "/usr/lpp/cobol/lib/igzcjava.x".


----------



## homer65 (17. Mrz 2011)

DieBeobachter hat gesagt.:


> Hallo homer65,
> vermutlich unter "/usr/lpp/cobol/include/JNI.cpy".
> Die LKED-Karte für die Cobol-UP-DLL dann unter "/usr/lpp/cobol/lib/igzcjava.x".



Habe beides gefunden, vielen Dank für den Hinweis.


----------



## uwe (17. Mrz 2011)

Hallo zusammen,

ein ganz anderer Ansatz wäre einen anderen COBOL (Cross-) Compiler unter z/OS zu verwenden, der COBOL nach Java umsetzt. Wie COBOL nach Java umgesetzt wird ist für den COBOL Entwickler nicht relevant, da er wie gewohnt das COBOL Verhalten beibehält.

Da dann COBOL schon auf Java Ebene vorhanden ist, können Parameter ganz einfach zwischen beiden Welten ausgetauscht werden. 

Eine viel ausdehnendere Frage wäre: muss z/OS bestehen bleiben, oder kann auch zLinux in Betracht gezogen werden?!?

viele grüße
uwe


----------



## homer65 (17. Mrz 2011)

Hallo Uwe,
es geht darum einen Rechenkern, der bisher in COBOL programmiert war, durch Java zu ersetzen.
Dieser Rechenkern wird von verschiedensten COBOL Programmen in unterschiedlichen Systemen aufgerufen.
Es soll aber nur der Rechenkern neu gemacht werden und nicht unsere komplette Softwarelandschaft umgekrempelt werden.


----------



## uwe (18. Mrz 2011)

Hallo Christian,

schade. Denn das ist ein Super Alternative zu dem Mainframe COBOL Compiler. So wie ich das verstehe ist es bei dir andersherum, dass COBOL Bleibt und Module nach Java ausgelagert werden.

Bei den Meisten Anwendungslandschaften ist es anders herum. Da wurde die grafische Oberfläche zum Beispiel mit Java Servlet erstellt, der vorhandene Rechenkern, der noch in COBOL vorhanden ist, soll dann darin eingebunden werden.

Für genauere Informationen, wenn Interesse besteht, bitte per eMail schicken.

viele grüße
uwe


----------



## jaka (21. Jun 2011)

Hallo zusammen,

Schaut euch doch mal den Foliensatz "Integrating COBOL with Java" von Tom Ross von der IBM an:

  www-304.ibm.com/support/docview.wss?uid=swg27015223&aid=1&wv=1

Dort findet sich eine Menge interessanter Fakten dazu!

Viele Grüße,
Kalli


----------

