如何通过JNI设置java类的双精度/整数类型的值

如何通过JNI设置java类的双精度/整数类型的值,java,android,c++,java-native-interface,Java,Android,C++,Java Native Interface,我刚才提出的问题是: 但是,我没有得到我想要的正确答案。 假设我有一个java类,如: class Data { public Integer value; } 本地人: public static native int testGet(Data tdobj); c代码: JNIEXPORT jint JNICALL test_jni_Native_testSet(JNIEnv *env, jclass type, jobject tdobj) { jclass tdobj

我刚才提出的问题是:

但是,我没有得到我想要的正确答案。 假设我有一个java类,如:

class Data
{
    public Integer value;
}
本地人:

public static native int testGet(Data tdobj);
c代码:

JNIEXPORT jint JNICALL
test_jni_Native_testSet(JNIEnv *env, jclass type, jobject tdobj)
{
    jclass tdobjClass = env->FindClass("xxxx/Data");
    jfieldID valueID = env->GetFieldID(tdobjClass, "value", "Ljava/lang/Integer;");
    env->SetIntField(tdobj, jValueID, 123);
    return 0;
}
当我调用Native.testGet时,程序崩溃,并显示错误消息,如下所示:

E/dalvikvm: JNI ERROR (app bug): accessed stale weak global reference 0x7b (index 30 in a table of size 6)
E/dalvikvm: VM aborting
Fatal signal 11 (SIGSEGV) at 0xdeadd00d (code=1), thread 26758 
我真的不知道


如何处理类中的双精度/整数类型,它看起来与字符串类型相同,但与字符串类型不同。似乎这样的类型可以由jobject处理,但结果让我感到困惑

谢谢


我不想使用double/int这样的基本类型来实现我的目标,我也不想使用函数。或者你可以告诉我,我希望的方式不可能达到我的目标。非常感谢~~

首先,当您从
数据
实例获取
字段时,它没有初始化,正如您的java代码所示,因此需要创建一个实例

第二,你不能改变整数值,你必须用你想要的值来实例化它。因此,创建一个新的整数,然后从
Data
实例更改
value
字段。大概是这样的:

JNIEXPORT jint JNICALL test_jni_Native_testSet(JNIEnv *env, jclass type, jobject tdobj)
{
    //Create Integer class, get constructor and create Integer object
    jclass intClass = env->FindClass(env, "java/lang/Integer");
    jmethodID initInt = env->GetMethodID(env, intClass, "<init>", "(I)V");
    if (NULL == initInt) return -1;
        jobject newIntObj = env->NewObject(env, intClass, initInt, 123);

    //Now set your integer into value atttribute. For this, I would
    //recommend you to have a java setter and call it in the same way 
    //as shown above

    //clean reference
    env->DeleteLocalRef(env, newIntObj); 
    return 0;
}
JNIEXPORT jint JNICALL test\u jni\u Native\u testSet(JNIEnv*env,jclass类型,jobject tdobj)
{
//创建Integer类,获取构造函数并创建Integer对象
jclass intClass=env->FindClass(env,“java/lang/Integer”);
jmethodidinitint=env->GetMethodID(env,intClass,”,“(I)V”);
if(NULL==initInt)返回-1;
jobject newIntObj=env->NewObject(env,intClass,initInt,123);
//现在将整数设置为attAttribute的值。为此,我将
//建议您使用java setter并以相同的方式调用它
//如上所示
//干净的参考
env->DeleteLocalRef(env,newIntObj);
返回0;
}

“如何处理类中的双精度/整数类型,它看起来与字符串类型相同,但与字符串类型不同。”而
Double
Integer
类型是类似
String
的引用类型,您并没有真正尝试以与
String
相同的方式使用它们-您调用的是
SetIntField
,它的意思是
int
字段,而不是
Integer
字段。您不能忽略基本类型和包装类型之间的差异。@JonSkeet那么我该如何处理我描述的情况?我不知道-但您不应该认为它与
字符串的情况相同。(如果你说了为什么你不想使用函数或者不想使用double
/
int
字段…@JonSkeet-Er,这会有帮助的。)。。。我只是想测试JNI是否支持我设置变量值的方式。@JonSkeet既然我可以通过jobject访问整型对象的引用,为什么我不能访问java类中整型对象的引用?也许,这是我关心的关键问题。我修改了测试空值的代码,比如:jobject newIntObj=env->NewObject(env,intClass,initInt,NULL);它在我的java代码中打印“0”。既然整数类型在java中可以设置为“null”值,那么,如何通过JNI将“null”设置为类的整数参数呢?如果我通过jmethodide initInt=env->GetMethodID(env,intClass,”,“(I)V”)新建一个jobject,我会得到这个结果;if(NULL==initInt)返回-1;jobject newIntObj=env->NewObject(env,intClass,initInt,NULL);newIntObj不能赋值为NULL,但结果为0,这是否意味着无论初始化值是多少(NULL或有效数字),“NewObject”都将新建一个整数对象。