2023-01-20 295
我编写一个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本地无法改变不变的对象.毕竟,两个对象都更改为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.因此,它们指向不是一个对象.我真的很困惑.
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使用一些怪异的优化.
编辑:看起来这是针对小价值的自动氧化的规则.
C代码
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;
我不认为 Integer 是可变的.您会看到它没有set方法.
以上所述是小编给大家介绍的奇怪:不能改变jni中Integer的值,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对77isp云服务器技术网的支持!
原文链接:https://77isp.com/post/25985.html
=========================================
https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。
数据库技术 2022-03-28
网站技术 2022-11-26
网站技术 2023-01-07
网站技术 2022-11-17
Windows相关 2022-02-23
网站技术 2023-01-14
Windows相关 2022-02-16
Windows相关 2022-02-16
Linux相关 2022-02-27
数据库技术 2022-02-20
抠敌 2023年10月23日
嚼餐 2023年10月23日
男忌 2023年10月22日
瓮仆 2023年10月22日
簿偌 2023年10月22日
扫码二维码
获取最新动态