gpt4 book ai didi

android - 奇怪的 : can not change the value of Integer in jni

转载 作者:太空宇宙 更新时间:2023-11-03 10:27:40 25 4
gpt4 key购买 nike

我写了一个 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',为什么?

=============================================

我做了很多测试,得到了以下几点。 (回答,欢迎评论)

  1. 我不认为这个 jni native 不能改变不可变对象(immutable对象)。毕竟两个对象都从0变成了10。

  2. 这与自动装箱有某种关系(是吗?我不确定)。也许 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。因此,它们指向的不是一个对象。我真的很困惑。

最佳答案

Integer i1 = 500, i2 = 10000;
testInts(i1, i2);
Log.d("log", "I1 = " + i1);
Log.d("log", "I2 = " + i2);

Integer i1 = new Integer(0), i2 = new Integer(0);
testInts(i1, i2);
Log.d("log", "I1 = " + i1);
Log.d("log", "I2 = " + i2);

输出

I1 = 10
I2 = 10
I1 = 5
I2 = 10
I1 = 5
I2 = 10

有效(使用您的示例的第一个结果)。我记得如果值在字节(或?)范围内,那么 java 会使用一些奇怪的优化。编辑:似乎这是对小值进行自动装箱的规则。

代码

    jclass clazz = (*env)->GetObjectClass(env, i1);
jfieldID mi = (*env)->GetFieldID(env, clazz, "value", "I");

(*env)->SetIntField(env, i1, mi, 5);
(*env)->SetIntField(env, i2, mi, 10);
return 0;

关于android - 奇怪的 : can not change the value of Integer in jni,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10650230/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com