Help coderanch get a
new server
by contributing to the fundraiser
  • Post Reply Bookmark Topic Watch Topic
  • New Topic
programming forums Java Mobile Certification Databases Caching Books Engineering Micro Controllers OS Languages Paradigms IDEs Build Tools Frameworks Application Servers Open Source This Site Careers Other Pie Elite all forums
this forum made possible by our volunteer staff, including ...
Marshals:
  • Campbell Ritchie
  • Jeanne Boyarsky
  • Ron McLeod
  • Paul Clapham
  • Liutauras Vilda
Sheriffs:
  • paul wheaton
  • Rob Spoor
  • Devaka Cooray
Saloon Keepers:
  • Stephan van Hulst
  • Tim Holloway
  • Carey Brown
  • Frits Walraven
  • Tim Moores
Bartenders:
  • Mikalai Zaikin

Urgent!Why the field of java object passed to native method becomes 0? (JNI Question)

 
Greenhorn
Posts: 3
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
Hi, All,
If any of you know the reason, please let me know. Your help will be greatly appreciated.
I am writing some JNI application, and find the field value of the java object passed to native method all becomes 0 in the native method, and I can not change the field of the object passed to the native method in the native method. I attached all the code in the following and the run result, please have a look at it, and let me know why?
The platform is PIV PC with Fedora Core 1 installed. And JDK is j2sdk1.4.2_04 from SUN.
-----------------------------
/*The Java Code*/
/*
* noa.java
*
* Created on March 28, 2004, 8:18 PM
*/
/**
*
* @author gechen
*/
public class noa {

public int iv;
public double dv;

/** Creates a new instance of noa */
/*
static{
System.load("/home/gechen/mytests/noa/class/libnoa.so");
}
*/

public native void callnative(noadc obja, noadc objb, int intv);

public noa() {
}

/**
* @param args the command line arguments
*/
public static void main(String[] args) {
noa obja = new noa();

noa objb = new noa();

//System.out.println(
obja.run();
}

public void run(){

noadc objin = new noadc();
noadc objout = new noadc();

objin.iv = 1;
objin.dv = 2.2;

System.load("/home/gechen/mytests/noa/class/libnoa.so");
System.out.println("Before Entering native call: objin iv="+objin.iv+" dv ="+objin.dv);
callnative(objin, objout, objin.iv);
System.out.println("After Return from native call: objin iv="+objin.iv+" dv ="+objin.dv);
System.out.println("After Return from native call: objout iv="+objout.iv+" dv ="+objout.dv);

}


}

/*
* noadc.java
*
* Created on March 28, 2004, 8:28 PM
*/
/**
*
* @author gechen
*/
public class noadc {

public int iv;

public double dv;

/** Creates a new instance of noadc */
public noadc() {
//this.iv = 0;
//this.dv = 0.0;
//System.out.println("In noadc()");
}


}
-----------------------------------------------
------------------------------------------------
/*The C code*/
#include <stdio.h>
#include "noa.h"
JNIEXPORT void JNICALL Java_noa_callnative
(JNIEnv *env, jobject to, jobject pobjin, jobject pobjout, jint piv)
{
jclass objin = (*env)->GetObjectClass(env, pobjin);

jfieldID fid_iv = (*env)->GetFieldID(env, objin, "iv", "I");
jint iv = (*env)->GetIntField(env, objin, fid_iv);
if (fid_iv == 0){
printf("fid_iv == 0, error return\n");
return;
}
jfieldID fid_dv = (*env)->GetFieldID(env, objin, "dv", "D");
jdouble dv = (*env)->GetDoubleField(env, objin, fid_dv);
printf("<Inside Native>: pobjin.iv=%d dv=%f piv=%d\n", iv, dv, piv);
jclass objout = (*env)->GetObjectClass(env, pobjout);
fid_iv = (*env)->GetFieldID(env, objout, "iv", "I");
(*env)->SetIntField(env, objout, fid_iv, 2);
iv = (*env)->GetIntField(env, objout, fid_iv);
printf("<Inside Native>: After SetIntField of objout.iv: objout.iv=%d\n",iv);
return;

}
-----------------------------------------------------------------
------------------------------------------------------------------
/*The execution result*/
Before Entering native call: objin iv=1 dv =2.2
<Inside Native>: pobjin.iv=0 dv=0.000000 piv=1
<Inside Native>: After SetIntField of objout.iv: objout.iv=2
After Return from native call: objin iv=1 dv =2.2
After Return from native call: objout iv=0 dv =0.0
---------------------------------------------------------------------
Thanks a lot. You help will be greatly appreciated.
--Robin
 
I like you because you always keep good, crunchy cereal in your pantry. This tiny ad agrees:
We need your help - Coderanch server fundraiser
https://coderanch.com/t/782867/Coderanch-server-fundraiser
reply
    Bookmark Topic Watch Topic
  • New Topic