Greetings...
I am having some problems with JNI. I have written some pseudo code to better explain my problem. Basically I have an object in Java that I pass into the native as an argument. In the native code I want to use the values of the variables encapsulated in that object. The thing is I assign the values on the Java side of things, but when they get into the C side of things, the values associated with the variables are zero. I thought it was a pointer type issue, but played around with that a lot in the native, and I'm 99% sure that's not it. If I ran the following code I would get the following output:
Val in Java: 13
MidVal: 0 FidVal: 0
Any insight is greatly appreciated.
//The Java Class
package MyPackage;
imports...
public Class NativeCaller{
public static void main(String[] args){
NativeCaller lCaller = new NativeCaller();
AClass lArgument = new AClass;
lArgument.setVal(13);//a simple setter
System.out.println("Val in Java: " + lArgument.getVal());//simple getter
lCaller.MyMethod(lArgument);
}
public synchronized native Object MyMethod(AClass inArg);
}
//The C Function
JNIEXPORT jobject JNICALL Java_SomeProject_MyPackage_MyClass_MyMethod(
JNIEnv *env, jobject jthis, jobject inObject){
jobject result = (jobject)NULL;
jclass lCls;
jmethodID jmid;
jfieldID jfid;
double lMidVal;
double lFidVal;
lCls = (*env)->FindClass(env, "SomeProject/MyPackage/AClass");
if (lCls == NULL){
printf("Error getting class");
return (jobject)NULL;
}
if (!(*env)->IsInstanceOf(env, inObject, lCls)){
printf("input object is not correct type");
return (jobject)NULL;
}
jmid = (*env)->GetMethodID(env, lCls, "getVal", "()D");
jfid = (*env)->GetFieldID(env, lCls, "lVal", "D");
if (jfid == NULL || jmid == NULL){
printf("Problem finding jmid or jfid");
return (jobject)NULL;
}
lMidVal = (*env)->CallDoubleMethod(env, inObject, jmid);
lFidVal = (*env)->GetDoubleField(env, inObject, jfid);
printf("Mid Val: %d Fid Val: %d", lMidVal, lFidVal);
//more stuff done here, irrelevent
return result;
}
Just to clarify, all the JNI works fine, it runs, returns a null object, and
otherwise works fine. I simply cannot get the values out from the object passed
to the native.
Nathan Washor
njwashor@yahoo.com