请教有关jni问题,高手请进!
请问:我在java代码中自定义了一个类,并定义了该类的数组。
在调用c++本地共享库函数时将该类的数组传进去。
那可以在c++本地共享库函数中可以调用jni函数GetObjectArrayElement将
类数组中每个类实例中的各个分量取出来吗?
-----java代码-------
import java.util.*;
class testClassName
{
public int intPara;
public String strPara1;
public String strPara2;
public testClassName(int im,String sm1,String sm2)
{
this.intPara = im;
this.strPara1 = sm1;
this.strPara2 = sm2;
}
}
public class callsofile {
public native void displayString(testClassName[] myobj);
static {
System.loadLibrary("invokesofile");
}
public static void main(String[] args) {
int k;
k = 2;
testClassName[] m_classArray = new testClassName[k];
m_classArray[0] = new testClassName(3,"123","456");
m_classArray[1] = new testClassName(4,"789","111");
//调用c++函数前显示数组各值
System.out.println("Display the value of ObjectArray before call the displayString()");
for(int i = 0;i< k;i++)
{
System.out.println("intPara["+i+"]" + m_classArray[i].intPara);
System.out.println("strPara1["+i+"]" + m_classArray[i].strPara1);
System.out.println("strPara2["+i+"]" + m_classArray[i].strPara2);
}
new callsofile().displayString(m_classArray);
System.out.println("Display the value of ObjectArray After calling displaying()");
for(int i = 0;i< k;i++)
{
System.out.println("intPara["+i+"]" + m_classArray[i].intPara);
System.out.println("strPara1["+i+"]" + m_classArray[i].strPara1);
System.out.println("strPara2["+i+"]" + m_classArray[i].strPara2);
}
System.out.println("Ending of the process!");
}
}
-----java代码-------
-----C++代码---
JNIEXPORT void JNICALL
Java_callsofile_displayString(JNIEnv *env, jobject obj, jobjectArray myobj)
{
jobject m_obj;
jclass cls;
jfieldID fid;
int intvalue;
jstring jstr;
const char * m_strPara1;
const char * m_strPara2;
const jsize len = env->GetArrayLength(myobj);
TaskStruct m_struct[2];
printf("Begin to print in the middle cplusplus file.\n");
for (int i=0; i<len; i++)
{
m_obj = env->GetObjectArrayElement(myobj,i);
printf("m_obj[%d] = %p\n",i,m_obj);
cls = env->GetObjectClass(m_obj);
printf("cls[%d] = %p\n",i,cls);
fid = env->GetFieldID(cls, "intPara", "I");
if (fid == 0) {
cout<<"fid for intPara expection"<<endl;
return;
}
printf("fid[%d] for intPara = %d\n",i,fid);
intvalue = env->GetIntField(cls,fid);
m_struct[i].ipara = intvalue;
printf("m_struct[%d].ipara =%d\n",i,intvalue);
env->SetIntField(cls, fid,200);
fid = env->GetFieldID(cls, "strPara1", "Ljava/lang/String;");
if (fid == 0) {
cout<<"fid for strPara1 expection"<<endl;
return;
}
printf("fid[%d] for strPara1 = %d\n",i,fid);
jstr = (jstring)env->GetObjectField(cls,fid);
m_strPara1 = env->GetStringUTFChars(jstr, 0);
strcpy(m_struct[i].spara1,m_strPara1);
printf("m_struct[%d].spara1 =%s\n",i,m_strPara1);
env->ReleaseStringUTFChars(jstr, m_strPara1);
jstr = env->NewStringUTF("aaaaa");
env->SetObjectField(cls, fid, jstr);
fid = env->GetFieldID(cls, "strPara2", "Ljava/lang/String;");
if (fid == 0) {
cout<<"fid for strPara2 expection"<<endl;
return;
}
printf("fid[%d] for strPara2=%d\n",i,fid);
jstr = (jstring)env->GetObjectField(cls,fid);
m_strPara2 = env->GetStringUTFChars(jstr, 0);
strcpy(m_struct[i].spara2,m_strPara2);
printf("m_struct[%d].spara2 =%s\n",i,m_strPara2);
env->ReleaseStringUTFChars(jstr, m_strPara2);
jstr = env->NewStringUTF("bbbbbbbb");
env->SetObjectField(cls, fid, jstr);
env->SetObjectArrayElement(myobj,i,m_obj);
}
printf("Ending of print in the middle cplusplus file.\n");
return;
}
----运行结果-----
Display the value of ObjectArray before call the displayString()
intPara[0]3
strPara1[0]123
strPara2[0]456
intPara[1]4
strPara1[1]789
strPara2[1]111
Begin to print in the middle cplusplus file.
m_obj[0] = 3003ac68
cls[0] = 3003ac6c
fid[0] for intPara = 877441176
m_struct[0].ipara =806033456
fid[0] for strPara1 = 877441200
m_struct[0].spara1 =
fid[0] for strPara2=877441224
m_struct[0].spara2 =
m_obj[1] = 3003ac7c
cls[1] = 3003ac80
fid[1] for intPara = 877441176
m_struct[1].ipara =200
fid[1] for strPara1 = 877441200
m_struct[1].spara1 =aaaaa
fid[1] for strPara2=877441224
m_struct[1].spara2 =bbbbbbbb
Ending of print in the middle cplusplus file.
Display the value of ObjectArray After calling displaying()
intPara[0]3
strPara1[0]123
strPara2[0]456
intPara[1]4
strPara1[1]789
strPara2[1]111
Ending of the process!
----运行结果----------
请高手帮助我看看。
为什么在C++代码里取出的数据不对?
而在java代码中,执行前后并没有因为C++那边对数据进行了重新设置而发生改变。
这个问题很奇怪。