我写了一个 jni 函数来设置 C 中两个 java Integer 对象的值,就像这样:
jni_do_something(JNIEnv *env, jobject thiz, jobject p1, jobject p2) {
jclass c;
jfieldID id;
c = env->FindClass("java/lang/Integer");
if (c==NULL)
{
LOGD("FindClass failed");
return -1;
}
id = env->GetFieldID(c, "value", "I");
if (id==NULL)
{
LOGD("GetFiledID failed");
return -1;
}
env->SetIntField(p1, id, 5);
env->SetIntField(p2, id, 10);
return 0;
}
在java中,我调用了这个函数:
native int do_something(Integer p1, Integer p2);
Integer p1=0, p2=0;
do_something(p1, p2);
Log.d("test", "p1: "+p1);
Log.d("test", "p2: "+p2);
输出都是'10',为什么?
================================================
我做了很多测试,得到了以下几点。(回答,欢迎评论)
我不认为这个 jni 本机无法更改不可变对象。毕竟这两个对象都从 0 变成了 10。
与自动装箱有一些关系(是的?我不确定)。也许 p1 和 p2 是由 jvm 专门处理的,如果初始化为指向单个对象:
整数 p1=0,p2=0;
如果更改为:
Integer p1=0, p2=1;
或者
Integer p1 = new Integer(0);
Integer p2 = new Integer(0);
结果是正确的 (p1:5, p2:10)。任何人都可以澄清这一点吗?
也许我说的不正确。我在java中编写了以下代码:
Integer a = 0;
Integer b = 0;
b = 10;
Log.d("test", "a: "+a);
Log.d("test", "b: "+b);
它输出 0、10。因此,它们指向的不是单个对象。我真的很困惑。