将值插入 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));
作为第一个循环的最后一句。您会看到数组第一个元素的值在每次迭代时都在更新,因为它仍然引用同一个对象。
我正在尝试创建 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));
作为第一个循环的最后一句。您会看到数组第一个元素的值在每次迭代时都在更新,因为它仍然引用同一个对象。