使用JNI时遇到的一个关于GetFieldID问题
我在做一个JNI,是把一个Java对象传递给C,我只是想在C中获取这个对象的其中一个String属性,然后printf出来,但发现GetFieldID()这不行了,代码如下:
Java 传递的对象的类是:
public class Wobj {
String myName;
int age;
//......get()..set()...
}
调用本地接口的类如下:
public class NativeRWtxt {
public void loadLibrary(String libStr){
System.loadLibrary(libStr);
//this.displayHello();
}
public void loadDll(String dllstr){
System.load(dllstr);//必须带绝对路径和后缀名
}
public native void Write2txt(Wobj wobj);//就是传递一个Wobj对象
}
通过javah生成h头文件,测试的java代码如下:
NativeRWtxt nr=new NativeRWtxt();
Wobj wobj=new Wobj();
wobj.setMyName("Chris");
wobj.setAge(99);
//省略加载dll的代码...
nr.Write2txt(wobj);
//完毕...
下面是C的代码:
JNIEXPORT void JNICALL Java_lq_jni_NativeRWtxt_Write2txt(JNIEnv *env, jobject obj, jobject wobj)
{
jclass wbj=(*env)->GetObjectClass(env,wobj);
if(wbj==NULL)
{
printf("Wobj is null!\n");
return;
}
jfieldID fid=(*env)->GetFieldID(env,wbj,"ss","I");
jint i=(*env)->GetIntField(env,wbj,fid);
//jfieldID fid=(*env)->GetFieldID(env,enty,"age","I");
if(fid==NULL)
{
printf("Failed to get fieldID!\n");
return;
}
fid=(*env)->GetFieldID(env,wbj,"myName","Ljava/lang/String");//问题就在这里
if(fid==NULL)
{
printf("Failed to get myName's value!");
return;
}
printf("wobj's age is:%d.\n",(int)i);
return;
}
编译好dll文件后,放入相应的class文件目录内,运行就报错,如下:
Exception in thread "main" java.lang.NoSuchFieldError: myName
at lq.jni.NativeRWtxt.Write2txt(Native Method)
at lq.jni.Debug.main(Debug.java:51)
Failed to get myName's value!
如果我注释掉GetFieldID(..."myName"...)那行,是可以往下执行的,而且age也能遭到,但得到的值也不是99,而是一串Long行数值......
这个问题一直困扰我啊,我不知道自己什么地方写错了还是怎么的,就是无法获取到Wobj对象里的String类型.希望大家给我指点一下,谢谢!