将值插入 JNI 中的 jobjectArray 时出现意外行为

Unexpected behaviour when inserting values into jobjectArray in JNI

我正在尝试创建 1D jobjectArray。从循环内部打印时,“args”数组打印正确的值,但一旦退出循环,只会重复打印最后一个元素。

这是“args”jobjectArray 声明:

//Declare an object array
jobjectArray args; 

//Get the class of the object, generally ava/lang/Object is enough
jclass objClass = (*env)->FindClass(env,"java/lang/Object");

//New object array
args = (*env)->NewObjectArray(env,unum, objClass, 0);

这是用于将值插入 jobjectArray 的循环: (rec_msg[] struct array 具有正确的值,创建或插入 jobject 没有问题)

for(int i=0; i < unum; i++ )
{
       printf("\ni-%d---", i);
       (*env)->SetShortField(env,obj,stat,1);
       (*env)->SetShortField(env,obj,fnumber,rec_msg[i].filenum );            
       str = (*env)->NewStringUTF(env, rec_msg[i].username);
       (*env)->SetObjectField(env,obj,user, str);                
                
       (*env)->SetObjectArrayElement(env,args, i, obj);
       printf("args fnum%d\n", (*env)->GetShortField(env, (*env)->GetObjectArrayElement(env, args, i), fnumber));
        
      
 }

此处的 printf 将 fnum(jobject 中的一个字段)的值正确打印为:

i-0-args fnum3

i-1-args fnum2

i-2-args fnum9

但是在 lopp 之后,我写了一个新的简单循环:

for(int i=0; i < unum; i++ )
    {
    printf("\ni-%d ARGS fnum%d",i, (*env)->GetShortField(env, (*env)->GetObjectArrayElement(env, args, i), fnumber));
  }

这会打印:

i-0 ARGS fnum9
i-1 ARGS fnum9
i-2 ARGS fnum9

即最后一个对象重复。此循环与上一个循环之间没有语句。我无法知道为什么“args”jobjectrray 在第一个循环中打印正常时会重复最后一个元素。如果需要任何其他详细信息,请告诉我。

您使用对同一对象的三个引用填充数组。在第一个循环中, obj 的值在每次迭代中都会发生变化,这就是您打印不同值的原因。尝试添加打印命令

printf("\ni-%d ARGS fnum%d",0,(*env)->GetShortField(env, (*env)->GetObjectArrayElement(env, args,0), fnumber));

作为第一个循环的最后一句。您会看到数组第一个元素的值在每次迭代时都在更新,因为它仍然引用同一个对象。