C is a pass-by-value language. However, those parameters can be pointers. The pointer can point to a value, however.
On i, the argument vector (argv) is an array of pointers to the argument values which are the parameters passed on the call.
Returning a value through the arguments is simply replacing the value at the memory location dereferenced from the pointer. One must be aware of the size of the memory space referenced and the type of value that is to be there.
JNI and PCML should be cooperating such that the argument passed to the C program is (a pointer to) the content of the object in the java method parameter. Be very careful about type. If you pass a java string, the c program must expect a double byte unicode value. That's what needs to be returned, as well. On the other hand, String is an immutable object in Java, so java will not let a string value be changed in a called program. Most times when I'm doing this, I'll pass a byte array to the c program. The byte array is already decoded from unicode into the CCSID my c program expects. Then just replace the byte array with the new value in the c program. You probably want to communicate the length of the byte array in one of the other parameters.
Jt400 class AS400Text.toBytes() is convenient for converting java string to byte array. If your c program is expecting an 80 character array, new AS400Text(80,system).toBytes("StringToPass",sytemvalue) will put the contents of "StringToPass" into systemvalue (an 80 character byte array). Pass systemvalue to the c program. Define systemvalue as byte[]systemvalue = new byte[80].
I don't use PCML to do this. PCML-related objects may do a lot of this work for you.
-----Original Message-----
From: java400-l-bounces@xxxxxxxxxxxx [mailto:java400-l-bounces@xxxxxxxxxxxx] On Behalf Of Joe Pluta
Sent: Wednesday, December 28, 2011 8:34 AM
To: Java Programming on and around the IBM i
Subject: Re: FW: Using PCML from Java to Call C/400 Program
On 12/28/2011 8:28 AM, David Gibbs wrote:
On 12/28/2011 6:11 AM, Tomer Sason wrote:
I am using PCML to call C/400 Program from my Java program. The C
Program gets 2 arguments in the main's argv[] argument , and set the
processed value back into argv[1]. When I run my java program and
send the excepted arguments, the C program is executed but I can not
get the returned value. I set the usage in the PCML file to be
inputoutput. Is there a way to get the value that set back in argv[1]
?
Although I'm not an expert in C, shouldn't each element of argv be specified as a separate parameter in the PCML?
So it would be something like ...
<pcml version="1.0">
<program name="myCProg" path="/QSYS.LIB/MyLib.LIB/MyC_Porg.PGM">
<data name="argv1" type="char" length="100" usage="inputoutput"/>
<data name="argv2" type="char" length="100" usage="inputoutput"/>
<data name="argv3" type="char" length="100" usage="inputoutput"/>
</program>
</pcml>
That way, if you set the value of argv[1], you could retrieve the value from the PCML using 'myCProg.argv1'.
Even more problematic is that AFAIK C parameters are not bidirectional.
Back in the day at SSA we had to create our own parameter passing technique. It used a stream file to pass parameters between the two programs. Ugh. The flashbacks! THE FLASHBACKS!!!!!
Joe
--
This is the Java Programming on and around the IBM i (JAVA400-L) mailing list To post a message email: JAVA400-L@xxxxxxxxxxxx To subscribe, unsubscribe, or change list options,
visit:
http://lists.midrange.com/mailman/listinfo/java400-l
or email: JAVA400-L-request@xxxxxxxxxxxx Before posting, please take a moment to review the archives at
http://archive.midrange.com/java400-l.
As an Amazon Associate we earn from qualifying purchases.