PDA

View Full Version : Aufruf von Java Methode aus RPG



codierknecht
22-03-05, 08:23
Hallo zusammen...

ich versuche nun schon seid einiger Zeit, eine einfache, selbstgeschriebene Java Klasse aus einem RPG-Programm aufzurufen.
Die Java Klasse mit der Methode ist fehlerfrei. Da liegt nicht das Problem.
Aber wenn ich die Methode aus RPG aufrufe erhalte ich den Fehler: "java.lang.NoSuchMethodError: berechne" .
Meine Klasse verfügt über diese Methode, die erwartet weder Parameter, noch gibt sie was zurück.
In RPG habe ich die Klasse/Methode so definiert:

D Aufruf PR EXTPROC(*JAVA : 'Rechner' : d 'berechne') D STATIC

C CALLP Aufruf

Die Klasse befindet sich in /HOME/USER als .java und .class
Ich habe auch schon den Klassenpfad mit:
ADDENVVAR ENVVAR(HOME) VALUE('/HOME/USER')
gesetzt, ohne Erfolg.

Weiß jemand, wo mein (Denk)Fehler liegt?

BenderD
22-03-05, 08:54
Hallo,

deren gibt es mehrere:
- Classpath ist case sensitive
- IFS root ist case sensitive
- Java Klassen könnten auch noch in einem Package sein, dann muss die Klasse entsprechend plaziert werden
- die JVM könnte später von einem vorherigen Aufruf bereits gestartet sein, dann zieht der Classpath nicht mehr

im übrigen ist davon abzuraten aus RPG synchron Java aufzurufen, für jeden Job, der sowas verwendet, wird eine eigene JVM gestartet und das dauert nicht nur lange, sondern fährt dir jede Kiste platt. Genau deshalb empfiehlt IBM das und macht Reklame für on demand.

mfg

Dieter Bender


Hallo zusammen...

ich versuche nun schon seid einiger Zeit, eine einfache, selbstgeschriebene Java Klasse aus einem RPG-Programm aufzurufen.
Die Java Klasse mit der Methode ist fehlerfrei. Da liegt nicht das Problem.
Aber wenn ich die Methode aus RPG aufrufe erhalte ich den Fehler: "java.lang.NoSuchMethodError: berechne" .
Meine Klasse verfügt über diese Methode, die erwartet weder Parameter, noch gibt sie was zurück.
In RPG habe ich die Klasse/Methode so definiert:

D Aufruf PR EXTPROC(*JAVA : 'Rechner' : d 'berechne') D STATIC

C CALLP Aufruf

Die Klasse befindet sich in /HOME/USER als .java und .class
Ich habe auch schon den Klassenpfad mit:
ADDENVVAR ENVVAR(HOME) VALUE('/HOME/USER')
gesetzt, ohne Erfolg.

Weiß jemand, wo mein (Denk)Fehler liegt?

KM
22-03-05, 15:37
...außerdem hast Du spätestens ab V5R3 ein Problem mit den JVMs. Ab diesem Release kann man nämlich nicht mehr als eine JVM in einem Job starten. Wie BenderD schon geschrieben hat, greift dann das Ändern des Classpaths nicht mehr, wenn die JVM schon gestartet ist. Und explizit beenden kann man eine JVM nach neuesten Informationen ab V5R3 auch nicht mehr. Wir stehen nämlich gerade vor dem Problem, dass nach dem Releasewechsel sämtliche Programme abschmieren, die diese Systematik benutzen.

Gruß,
KM

BenderD
22-03-05, 15:51
Hallo,

das kann ich mir nicht vorstellen, das würde der JNI Spezifikation widersprechen und die Kaffeetasse kosten. Es könnte allerdings sein, dass dann einiges an dem Murks nicht mehr so glatt funktioniert, den der RPG Compiler da so zusammen schustert.

mfg

Dieter Bender


Und explizit beenden kann man eine JVM nach neuesten Informationen ab V5R3 auch nicht mehr. KM

KM
22-03-05, 16:10
Anbei eine Antwort von Barbara Morris (die bei IBM bzgl. RPG und Java nicht ganz unbekannt ist). Ich hab das allerdings noch nicht ausprobiert.


you won't be able to end the JVM when you go to V5R2. The system changed not to allow the JVM to be destroyed explicitly, and if it gets destroyed due to some error, you can't create another one.


Gruß,
KM

BenderD
22-03-05, 16:32
Hallo,

RPG mag sie ja können ... das ist wohl aus der Java400-l und bezieht sich meines Wissens auf RCLACTGRP, was ich ansprach sind die C Apis zum laden und beenden von JVMs; da müsste man dann für RPG Prototypen schreiben und die aufrufen, aber wahrscheinlich klebt man dann an der Ecke, dass der Krumsch, den der RPG Compiler generiert hat die JVM nicht findet und man müsste das dann auch zu Fuß machen. Aber ich bin da sowieso für striktes entkoppeln über einen asynchronen Serverdienst mit einer residenten JVM.

mfg

Dieter Bender


Anbei eine Antwort von Barbara Morris (die bei IBM bzgl. RPG und Java nicht ganz unbekannt ist). Ich hab das allerdings noch nicht ausprobiert.



Gruß,
KM

codierknecht
23-03-05, 07:30
Hallo zusammen,

ich habe nun ein kleines Programm geschrieben, dass JNI verwendet (Standartbeispiel vin IBM).
Das Programm wird mit der Meldung abgebrochen, dass die Klasse java. BigDecimal nicht gefunden wurde. Wo befinden sich die Standardklassen auf der AS400? Wie muß ich den Classpath setzen?

Vielen Dank

BenderD
23-03-05, 08:31
Hallo,

für BigDecimal garnicht, jedenfalls wenn du java.math.BigDecimal meinst, dann musst du das allerdings bei JNI auch sagen.

Dieter Bender

PS: vielleicht noch eine grundsätzliche Anmerkung: es macht wenig Sinn sich ausgerechnet mit JNI und RPG Java Mix zu beschäftigen, ohne einigermaßen solide Java Kenntnisse zu haben, da stolpert man von einer Katastrophe in die nächset und was dann nacher funktioniert sind dann Zufalls Ergebnisse.


Hallo zusammen,

ich habe nun ein kleines Programm geschrieben, dass JNI verwendet (Standartbeispiel vin IBM).
Das Programm wird mit der Meldung abgebrochen, dass die Klasse java. BigDecimal nicht gefunden wurde. Wo befinden sich die Standardklassen auf der AS400? Wie muß ich den Classpath setzen?

Vielen Dank