|
This is a multipart message in MIME format.
--
[ Picked text/plain from multipart/alternative ]
FYI:
with regards to my first question below: Pgm-2 does work properly! One of
the options I am passing was messing up the classpath and making me think
that it wasn't working.
regarding (2), I would still appretiate the answers for that.
Thanks,
Ali
"Ali Ekinci" <Ali.Ekinci@mapics.com>
Sent by: rpg400-l-admin@midrange.com
07/30/2002 06:52 PM
Please respond to rpg400-l
To: "rpg400-l" <rpg400-l@midrange.com>
cc:
Subject: re: starting JVM with properties through JNI apis
This is a multipart message in MIME format.
--
[ Picked text/plain from multipart/alternative ]
I have couple of questions:
1) I am trying to start JVM with properties through using JNI api
JNI_CreateJavaVM.
Thanks to the help from Barbara Morris, I put together the pgm-1 below,
and it works OK to create JVM with a single property. But when I try to
pass multiple properties in pgm-2, it doesn't work. Could anybody see
what is it I am doing wrong in pgm-2 ?
(Launcher class has a simple method PrtSysPrt to print system properties
to test whether JVM creation went OK.)
2) Barbara also recommended me to define JNI_CreateJavaVM parameters in a
C pgm then import it to RPG. It works greately even for multiple
properties. I was able to write a simple C pgm and hard code my
properties. Pgm-3 is the RPG that imports the JNI parm from the C pgm-4.
But my properties are not static, so If I can improve pgm-4 to get
property values as paramaters, and build the options array, then return
the optadr variable, I can call pgm-4 from pgm-3, pass the properties,
then it should do what I want.
Could anybody help me to make pgm-4 improvements in C language?
(I did try to write pgm-5, but I can not compile it.)
Thanks for all the help in advance.
Ali
=====================================================================
Program-1.
=====================================================================
/define OS400_JVM_12
h thread(*serialize)
h dftactgrp(*no)
*
* This pgm builds a single option, and
* starts JVM with that property.
*
*
* Include JNI declarations and prototypes
*
/copy qsysinc/qrpglesrc,jni
*
* Declare HostManager class, methods, and params
*
d PrtSysPrt PR EXTPROC(*JAVA:
d 'Launcher':
d 'PrtSysPrp')
d STATIC
*
* Delcare local procedure pointers
*
d getJniEnv PR *
**************************************************************************
* Mainline
**************************************************************************
/free
JNIEnv_P=getJniEnv();
PrtSysPrt();
*inlr = *on;
return;
/end-free
**************************************************************************
* Procedure - getJniEnv
**************************************************************************
p getJniEnv B EXPORT
d getJniEnv PI *
d rc S LIKE(jint)
d rpgRc S N
d jvm S * DIM(1)
d env S *
d bufLen S LIKE(jsize) INZ(%elem(jvm))
d nVMs S LIKE(jsize)
* Declare input structures for creating/attaching the JVM
d initArgs2 DS LIKEDS(JavaVMInitArgs)
d attachArgs2 DS LIKEDS(JavaVMAttachArgs)
d singleOption DS LIKEDS(JavaVMOption)
d qdcxlate PR EXTPGM('QDCXLATE')
d xLen 5P 0 CONST
d xData 1000A OPTIONS(*VARSIZE)
d xTable 10A
d temp S 1000A
d lenParam S 5P 0 STATIC
d dataParam S * STATIC
d tableParam S 10A INZ('QASCII ') STATIC
d optStrXX S 256A VARYING
d INZ('-Dtest=SingleInternalOption')
/free
//---------------------------------------------------------------------
// See if there's a JVM started
//---------------------------------------------------------------------
rc = JNI_GetCreatedJavaVMs (jvm : bufLen : nVMs);
//---------------------------------------------------------------------
// If JVM is started, just attach to it, to get the env pointer
//---------------------------------------------------------------------
if (rc = 0 and nVMs > 0);
// #gwo -- PRE-EXISTING VM IS NOT ALLOWED
// WE NEED TO THROW AN EXCEPTION
attachArgs2 = *ALLX'00';
attachArgs2.version = JNI_VERSION_1_2;
JavaVM_P = jvm(1);
rc = AttachCurrentThread (jvm(1): env : %addr(attachArgs2));
//---------------------------------------------------------------------
// If JVM is not started, start it
//---------------------------------------------------------------------
else;
// Set VM arguments
temp = optstrXX;
callp qdcxlate(%len(optstrXX) : temp : tableParam);
optstrXX = %subst(temp : 1 : %len(optstrXX)) + x'00';
optStrXX= optStrXX+x'00';
singleOption.optionString = %addr(optStrXX)+2;
singleOption.extraInfo = *NULL;
initArgs2.version = JNI_VERSION_1_2;
initArgs2.nOptions = 1;
initArgs2.options = %addr(singleOption);
rc = JNI_CreateJavaVM (jvm(1) : env : %addr(initArgs2));
// Display result
dsply rc;
endif;
if (rc = 0);
return env;
else;
return *NULL;
endif;
/end-free
P getJniEnv E
=====================================================================
=====================================================================
Program-2.
=====================================================================
/define OS400_JVM_12
h thread(*serialize)
h dftactgrp(*no)
*
* This pgm builds multiple JVM options, and
* starts JVM with that properties.
*
*
* Include JNI declarations and prototypes
*
/copy qsysinc/qrpglesrc,jni
*
* Declare HostManager class, methods, and params
*
d PrtSysPrt PR EXTPROC(*JAVA:
d 'Launcher':
d 'PrtSysPrp')
d STATIC
*
* Delcare local procedure pointers
*
d getJniEnv PR *
**************************************************************************
* Mainline
**************************************************************************
/free
JNIEnv_P=getJniEnv();
PrtSysPrt();
*inlr = *on;
return;
/end-free
**************************************************************************
* Procedure - getJniEnv
**************************************************************************
p getJniEnv B EXPORT
d getJniEnv PI *
d rc S LIKE(jint)
d rpgRc S N
d jvm S * DIM(1)
d env S *
d bufLen S LIKE(jsize) INZ(%elem(jvm))
d nVMs S LIKE(jsize)
* Declare input structures for creating/attaching the JVM
d initArgs2 DS LIKEDS(JavaVMInitArgs)
d attachArgs2 DS LIKEDS(JavaVMAttachArgs)
d vmOptions DS LIKEDS(JavaVMOption)
d OCCURS(7)
d qdcxlate PR EXTPGM('QDCXLATE')
d xLen 5P 0 CONST
d xData 1000A OPTIONS(*VARSIZE)
d xTable 10A
d temp S 1000A
d lenParam S 5P 0 STATIC
d dataParam S * STATIC
d tableParam S 10A INZ('QASCII ') STATIC
d optStr01 S 256A VARYING
d INZ('-Dtest=MultInternalOpt')
d optStr02 S 256A VARYING
d INZ('-Dali=ali222222222')
d optStr03 S 256A VARYING
d INZ('-Djava.ext.dirs=+
d /ALIEKINCI/test')
d optStr04 S 256A VARYING
d INZ('-Djava.naming.factory.initial=+
d com.pjx.naming.context.PjxInitial+
d ContextFactory')
d optStr05 S 256A VARYING
d INZ('-Djava.naming.factory.url.+
d pkgs=com.pjx.naming')
d optStr06 S 256A VARYING
d INZ('-Djava.naming.provider.url=+
d rmi://localhost:34999')
d optStr07 S 256A VARYING
d INZ('-Dcom.pjx.scs.HostName=+
d USATLD06')
/free
//---------------------------------------------------------------------
// See if there's a JVM started
//---------------------------------------------------------------------
rc = JNI_GetCreatedJavaVMs (jvm : bufLen : nVMs);
//---------------------------------------------------------------------
// If JVM is started, just attach to it, to get the env pointer
//---------------------------------------------------------------------
if (rc = 0 and nVMs > 0);
// #gwo -- PRE-EXISTING VM IS NOT ALLOWED
// WE NEED TO THROW AN EXCEPTION
attachArgs2 = *ALLX'00';
attachArgs2.version = JNI_VERSION_1_2;
JavaVM_P = jvm(1);
rc = AttachCurrentThread (jvm(1): env : %addr(attachArgs2));
//---------------------------------------------------------------------
// If JVM is not started, start it
//---------------------------------------------------------------------
else;
// Set VM options
%occur(vmOptions) = 1;
temp = optstr01;
callp qdcxlate(%len(optstr01) : temp : tableParam);
optstr01 = %subst(temp : 1 : %len(optstr01)) + x'00';
vmOptions.optionString = %addr(optStr01)+2;
vmOptions.extraInfo = *NULL;
%occur(vmOptions) = 2;
temp = optstr02;
callp qdcxlate(%len(optstr02) : temp : tableParam);
optstr02 = %subst(temp : 1 : %len(optstr02)) + x'00';
vmOptions.optionString = %addr(optStr02)+2;
vmOptions.extraInfo = *NULL;
%occur(vmOptions) = 3;
temp = optstr03;
callp qdcxlate(%len(optstr03) : temp : tableParam);
optstr03 = %subst(temp : 1 : %len(optstr03)) + x'00';
vmOptions.optionString = %addr(optStr03)+2;
vmOptions.extraInfo = *NULL;
%occur(vmOptions) = 4;
temp = optstr04;
callp qdcxlate(%len(optstr04) : temp : tableParam);
optstr04 = %subst(temp : 1 : %len(optstr04)) + x'00';
vmOptions.optionString = %addr(optStr04)+2;
vmOptions.extraInfo = *NULL;
%occur(vmOptions) = 5;
temp = optstr05;
callp qdcxlate(%len(optstr05) : temp : tableParam);
optstr05 = %subst(temp : 1 : %len(optstr05)) + x'00';
vmOptions.optionString = %addr(optStr05)+2;
vmOptions.extraInfo = *NULL;
%occur(vmOptions) = 6;
temp = optstr06;
callp qdcxlate(%len(optstr06) : temp : tableParam);
optstr06 = %subst(temp : 1 : %len(optstr06)) + x'00';
vmOptions.optionString = %addr(optStr06)+2;
vmOptions.extraInfo = *NULL;
%occur(vmOptions) = 7;
temp = optstr07;
callp qdcxlate(%len(optstr07) : temp : tableParam);
optstr07 = %subst(temp : 1 : %len(optstr07)) + x'00';
vmOptions.optionString = %addr(optStr07)+2;
vmOptions.extraInfo = *NULL;
// Set VM arguments
%occur(vmOptions) = 1;
initArgs2.version = JNI_VERSION_1_2;
initArgs2.nOptions = 7;
initArgs2.options = %addr(vmOptions);
rc = JNI_CreateJavaVM (jvm(1) : env : %addr(initArgs2));
// Display result
dsply rc;
endif;
if (rc = 0);
return env;
else;
return *NULL;
endif;
/end-free
P getJniEnv E
=====================================================================
Program-3.
=====================================================================
/define OS400_JVM_12
h thread(*serialize)
*
* This pgm imports the JVM properties structure from C module pgm-4
*
*
* Include JNI declarations and prototypes
*
/copy qsysinc/qrpglesrc,jni
*
* Declare HostManager class, methods, and params
*
d PrtSysPrt PR EXTPROC(*JAVA:
d 'Launcher':
d 'PrtSysPrp')
d STATIC
d optadr S * import('optadr')
*
* Delcare local procedure pointers
*
d getJniEnv PR *
**************************************************************************
* Mainline
**************************************************************************
/free
JNIEnv_P=getJniEnv();
PrtSysPrt();
*inlr = *on;
return;
/end-free
**************************************************************************
* Procedure - getJniEnv
**************************************************************************
p getJniEnv B EXPORT
d getJniEnv PI *
d rc S LIKE(jint)
d rpgRc S N
d jvm S * DIM(1)
d env S *
d bufLen S LIKE(jsize) INZ(%elem(jvm))
d nVMs S LIKE(jsize)
* Declare input structures for creating/attaching the JVM
d attachArgs2 DS LIKEDS(JavaVMAttachArgs)
d qdcxlate PR EXTPGM('QDCXLATE')
d xLen 5P 0 CONST
d xData 1000A OPTIONS(*VARSIZE)
d xTable 10A
d temp S 1000A
d lenParam S 5P 0 STATIC
d dataParam S * STATIC
d tableParam S 10A INZ('QASCII ') STATIC
/free
//---------------------------------------------------------------------
// See if there's a JVM started
//---------------------------------------------------------------------
rc = JNI_GetCreatedJavaVMs (jvm : bufLen : nVMs);
//---------------------------------------------------------------------
// If JVM is started, just attach to it, to get the env pointer
//---------------------------------------------------------------------
if (rc = 0 and nVMs > 0);
// #gwo -- PRE-EXISTING VM IS NOT ALLOWED
// WE NEED TO THROW AN EXCEPTION
attachArgs2 = *ALLX'00';
attachArgs2.version = JNI_VERSION_1_2;
JavaVM_P = jvm(1);
rc = AttachCurrentThread (jvm(1): env : %addr(attachArgs2));
//---------------------------------------------------------------------
// If JVM is not started, start it
//---------------------------------------------------------------------
else;
// Set VM arguments
rc = JNI_CreateJavaVM (jvm(1) : env : optadr);
dsply rc;
endif;
if (rc = 0);
return env;
else;
return *NULL;
endif;
/end-free
P getJniEnv E
=====================================================================
Program-4.
=====================================================================
#define OS400_JVM_12
#include <jni.h>
/* Specify the pragma that causes all literal strings in the
* source code to be stored in ASCII (which, for the strings
* used, is equivalent to UTF-8)
*/
#pragma convert(819)
char *option1 = "-Dtest=SingleCimportedoOptionnnnnnnnnnnnnnnnnn";
JavaVMOption options[4] = { {
"-Dxxx=yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy", 0 },
{ "-Dx=y", 0 },
{
"-Dzzzzzzzzzzzzz=aliiiiiiiiiiiiiiiiiiiiiiiiii",0 },
{
"-Djava.naming.provider.url=rmi://localhost:34999", 0 } };
JavaVMInitArgs initArgs = { 0x00010002,4,options,1 };
JavaVMInitArgs *optadr = &initArgs;
=====================================================================
Program-5.
=====================================================================
#define OS400_JVM_12
#include <jni.h>
#pragma convert(819)
void main(int argc, char *argv[])
{
JavaVMOption options[10];
JavaVMInitArgs initArgs;
JavaVMInitArgs *optadr;
int i;
for (i=0; i<argc; ++i);
options[i].optionString=argv[i];
initArgs.version = 0x00010002;
initArgs.nOptions = argc-1;
initArgs.options = options;
initArgs.ignoreUnrecognized = 1;
JavaVMInitArgs *optadr = &initArgs;
}
_______________________________________________
This is the RPG programming on the AS400 / iSeries (RPG400-L) mailing list
To post a message email: RPG400-L@midrange.com
To subscribe, unsubscribe, or change list options,
visit: http://lists.midrange.com/cgi-bin/listinfo/rpg400-l
or email: RPG400-L-request@midrange.com
Before posting, please take a moment to review the archives
at http://archive.midrange.com/rpg400-l.
As an Amazon Associate we earn from qualifying purchases.
This mailing list archive is Copyright 1997-2025 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.