Hi all,
How to read variable arraySize=100 and newArray = 2
and print it (printf()) inside JVM.
That is I created a JVM (JNI_CreateJavaVM), I only
able to get the variable arraySize=0
by using field ID. Is it possible to get the
arraySize=100 and newArray = 2 and print it out
in C native program? Thank you
soonho
***********************************************************************
//ArrrayHandler.java
public class ArrayHandler {
int arraySiz=0; public static void main(String[]
args) {
int arraySize = 100; System.out.println("value of arraySize is "+ arraySize); setArray(2); } public static void setArray(int
x)
{ int newArray = x; System.out.println("value of newArray is "+ newArray); } } ***********************************************************************
//arrayofc.c - only able to read arraySize =
0
#include <jni.h>
main(/*int argc, char *argv[], char **envp*/)
{
char string1[10];
JavaVMOption options[2]; JavaVMInitArgs vm_args; JavaVM *jvm; JNIEnv *env; long result; jmethodID mid; jfieldID fid; jobject jobj; jclass cls; int i, asize; jstring jstr; jobjectArray args; options[0].optionString =
"-Djava.class.path=.";
options[1].optionString = "-Djava.compiler=NONE"; // options[2].optionString = "-verbose:jni"; vm_args.version = JNI_VERSION_1_2;
vm_args.options = options; vm_args.nOptions = 2; vm_args.ignoreUnrecognized = JNI_FALSE; result = JNI_CreateJavaVM(&jvm,(void
**)&env, &vm_args);
printf("JVM created\n"); if(result == JNI_ERR ) { printf("Error invoking the JVM"); exit (-1); } cls = (*env)->FindClass(env,
"ArrayHandler");
if (cls == 0) { printf("Can't find ArrayHandler class\n"); exit(-1); } (*env)->ExceptionClear(env);
mid=(*env)->GetMethodID(env, cls, "<init>", "()V"); jobj=(*env)->NewObject(env, cls, mid); fid=(*env)->GetFieldID(env, cls, "arraySize", "I"); asize=(*env)->GetIntField(env, jobj, fid); printf("size of array is
%d\n",asize);
mid = (*env)->GetStaticMethodID(env, cls, "main", "([Ljava/lang/String;)V"); if (mid == 0) { fprintf(stderr, "Can't find ArrayHandler.main\n"); exit(1); } (*env)->CallStaticVoidMethod(env, cls, mid);
(*jvm)->DestroyJavaVM(jvm);
} |