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

How to set the value of a Double/Integer type of a java class by JNI

本文关键字:双精度 类型 整数 何通过 JNI 设置 java      更新时间:2023-10-16

早些时候,我问了一个问题:

如何通过 JNI 设置我的类的"双精度"类型变量的值?

但是,我没有得到我想要的正确答案。假设我有一个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 这样的基元类型来达到我的目标,我也不想使用函数。或者你可以告诉我,我希望的方式不可能达到我的目标。多谢~~

首先,当您从实例中获取value字段时Data它不会初始化,如您的 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;
}