想在本地代码中用输出参数传一个自定义的类数组,遇到了一些问题,请教一下各位高手,多谢
C++中的代码是这样的:
JNIEXPORT jint JNICALL Java_GetIEJni_getMapIes___3B_MapIe_2
  (JNIEnv *jEnv, jobject jobj, jbyteArray msg, jobjectArray jobjIe)
{
int j=0;
for(int i=0;i<G_IE_BUF_SIZE;i++)
{
if(g_ie_buf[i].ie != ZERO)
{
printf("\nThe result are: %d,%d",g_ie_buf[i].ie,j);
jobject jIe = jEnv->GetObjectArrayElement(jobjIe,j);
printf("\naaaaaa");
jclass jClass = jEnv->GetObjectClass(jIe);
printf("\nbbbbbb");
jfieldID fie = jEnv->GetStaticFieldID(jClass,"ie","S");
printf("\ncccccc");
jEnv->SetStaticShortField(jClass,fie,g_ie_buf[i].ie);
printf("\ndddddd");
jfieldID flen = jEnv->GetStaticFieldID(jClass,"len","B");
printf("\neeeeee");
jEnv->SetStaticByteField(jClass,flen,g_ie_buf[i].elength);
printf("\naaabbb");
jEnv->SetObjectArrayElement(jobjIe,j,jClass);
printf("\ncccaaa");
printf("\nffffffff");
j++;
}
}
printf("\nThe Array is finished");
free(g_ie_buf);
    return 1;
}
在java中运行,结果如下:
The result are: 63,0
aaaaaa
bbbbbb
cccccc
dddddd
eeeeee
aaabbb
cccaaa
ffffffff
The result are: 81,1
aaaaaa
bbbbbb
cccccc很明显,进入第二次循环的时候,设置数组jobjIe中的元素时,就出错了,
当我把jEnv->SetObjectArrayElement(jobjIe,j,jClass);屏蔽掉时,程序不会出错,但是输出参数jobjIe中所有元素都是一样的,也就是只取了g_ie_buf中的最后一个值。
请问哪位有这方面的经验?还望不吝赐教,谢谢!

解决方案 »

  1.   

    jobjectArray不怎么好用,好象和JAVA的数组兼容有问题。我都是用的jobject,直接把JAVA中的Vector对象看做jobject。示范:JNIEXPORT jint JNICALL Java_GetIEJni_getMapIes___3B_MapIe_2 
      (JNIEnv *jEnv, jobject jobj, jbyteArray msg, jobject jteamMebs) 
    {
    jclass jVect = jEnv->GetObjectClass( jobjIe );
    ...
    jobject jb = jEnv->AllocObject( jcs );        jfieldID fd1 = jEnv->GetFieldID( jcs, "name", "Ljava/lang/String;" );
            jfieldID fd2 = jEnv->GetFieldID( jcs, "age",  "I" );        jEnv->SetObjectField( jb, fd1, jEnv->NewStringUTF(p->name.c_str()) );
            jEnv->SetIntField( jb, fd2, p->age );        jmethodID va = jEnv->GetMethodID( jVect, "addElement", "(Ljava/lang/Object;)V" );
            jEnv->CallVoidMethod( jteamMebs, va, jb );
    ......
    }