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"/>

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!!!!!

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.

This thread ...


Follow On AppleNews
Return to Archive home page | Return to MIDRANGE.COM home page

This mailing list archive is Copyright 1997-2022 by midrange.com and David Gibbs as a compilation work. Use of the archive is restricted to research of a business or technical nature. Any other uses are prohibited. Full details are available on our policy page. If you have questions about this, please contact [javascript protected email address].

Operating expenses for this site are earned using the Amazon Associate program and Google Adsense.