请问:我在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++那边对数据进行了重新设置而发生改变。
这个问题很奇怪。