Hello,

I run into problem with JNI. Seems it can't set field variable, nor can
it be used in Thread. Here's my program:

//HelloWorld.java
import java.lang.*;

class HelloWorld extends Thread{
  int fd=-1;
  public native void displayHelloWorld();
  public native void sayFd();
  public void run(){
        System.out.println("init");
        displayHelloWorld();
        System.out.println("run");
        sayFd();
        System.out.println("fd="+fd);
   }

  public static void main(String[] args) {
        HelloWorld h1=new HelloWorld();
        HelloWorld h2=new HelloWorld();       
        h1.start();
        h2.start();
        while(h1.isAlive() || h2.isAlive());
  }
  static {
    System.loadLibrary("Hello");
  }
}              

/* HelloWorldImp.c */
#include <jni.h>
#include "HelloWorld.h"
#include <stdio.h>

JNIEXPORT void JNICALL
Java_HelloWorld_displayHelloWorld(JNIEnv *Env, jobject jobj){
      jint fd1;
      jclass    jcls = (*Env)->GetObjectClass(Env, jobj);
      jfieldID  jfd  = (*Env)->GetFieldID(Env, jcls, "fd", "I");
      fd1=(*Env)->GetIntField(Env,jcls,jfd)+1;
      (*Env)->SetIntField(Env, jcls, jfd, fd1);
      fd1=(*Env)->GetIntField(Env,jcls,jfd);
      printf("Hello world!%d\n",fd1);
      return;
}
JNIEXPORT void JNICALL Java_HelloWorld_sayFd  (JNIEnv *Env, jobject
jobj){

      jint fd2;
      jclass    jcls = (*Env)->GetObjectClass(Env, jobj);
      jfieldID  jfd  = (*Env)->GetFieldID(Env, jcls, "fd", "I");
      fd2=(*Env)->GetIntField(Env,jcls,jfd);
      printf("Hello world!%d\n",fd2);          
}

and result:
init
HelloWorld!2
run
HelloWorld!2
fd=-1
init
HelloWorld!3
run
HelloWorld!3
fd=-1

  My question:
1. Why '     (*Env)->SetIntField(Env, jcls, jfd, fd1);' can not set fd.
It remains -1.
2. Why two instances of HelloWorld share the same variable fd1? See its
value increments.
3. Where does the initail value 2 from?

Thanks,
Howard

Reply via email to