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