请教有关jni问题,高手请进!

sisicat 2003-09-12 05:39:07
请问:我在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++那边对数据进行了重新设置而发生改变。
这个问题很奇怪。
...全文
58 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
JavaBoyCaoJi 2003-09-13
  • 打赏
  • 举报
回复
up

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧