如何设置的值��双重的�� JNI的类的类型变量?

 2023-01-19    354  

问题描述

如果我只想将值设置为double类型变量,我可能会像:

一样代码

如何设置的值��双重的�� JNI的类的类型变量?

public static native int getDoubleVar(Double dobj);
JNIEXPORT jint JNICALL
test_jni_Native_testGet(JNIEnv *env, jclass type, jobject dobj)
{
    jclass DoubleClass = env->FindClass("java/lang/Double");
    jfieldID valueID = env->GetFieldID(DoubleClass, "value", "D");
    env->SetDoubleField(dobj, valueID, 2.3);
    return 0;
}

这些代码toke效果.

但是,当我试图设置JNI的”双重”变量的值时,我无法理解我想要的东西,当然,这会使我有些困惑.

Java代码:

public class TestDouble
{

    public Double value;
    public long num;
    public TestDouble(long num, Double value)
    {
        this.num = num;
        this.value = value;
    }
}

本地:

public static native int testGet(TestDouble tdobj);

C代码:

JNIEXPORT jint JNICALL
test_jni_Native_testGet(JNIEnv *env, jclass type, jobject tdobj)
{
    jclass tdobjClass = env->FindClass("xxxx/TestDouble");
    jfieldID valueID = env->GetFieldID(tdobjClass, "value", "D");
    env->SetDoubleField(tdobj, jValueID, 2.3);    return 0;
}

我想设置类’testdouble’的”值”的值,而’value’的类型为” double”(不是double).

E/dalvikvm: VM aborting
Fatal signal 6
Send stop signal to pid:5830 in void debuggerd_signal_handler(int, siginfo_t*, void*)

我只是在这里粘贴了关键单词,很明显,错误发生在:

env->SetDoubleField(tdobj, jValueID, 2.3);

那我该怎么办才能解决这个问题?
非常感谢!

推荐答案

我得到正确的答案:

http://stackoverflow.com/questions/34848605/how-to-set-the-value-of-a-double-integer-type-of-a-java-class-by-jni

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;
}

整数/do​​uble和其他包装器类型可以以相同的方式处理.

其他推荐答案

您的C代码假设TestDouble.value是primitve double而不是对象Double,因此在运行时失败.

您可以将类定义更改为

public class TestDouble
{
    public double value;
    public long num;
    public TestDouble(long num, double value)
    {
        this.num = num;
        this.value = value;
    }
}

其他推荐答案

如果您的双对象已经在Java代码中创建,则无需在C ++(对不起,而不是C)部分中创建一个新的双对象.您可以按以下操作:

void setDoubleObjectField(JNIEnv* env, jobject PropertyDoubleObj, char* FieldName, double dValue)
{
    jclass PropertyClass = (env)->GetObjectClass(PropertyDoubleObj);

    //printf("%s\n",getClassName( env, PropertyDoubleObj));

    jfieldID fidNumber = (env)->GetFieldID(PropertyClass, FieldName, "Ljava/lang/Double;");
    if (fidNumber == 0)
    {

        CreateException(env, std::string("Failed to query field from PropertyDouble class: ") + FieldName);
        return;
    }

    jobject DoubleObject = env->GetObjectField(PropertyDoubleObj, fidNumber);

    if (DoubleObject == 0) // That means, the object was simply not created. Just create one.
    {
        jclass DoubleClass = env->FindClass("java/lang/Double");
        jmethodID initDouble = env->GetMethodID( DoubleClass, "<init>", "(D)V");
        if (NULL == initDouble)
        {
            CreateException(env, "Failed to create Double object.");
            return;

        }
        DoubleObject = env->NewObject( DoubleClass, initDouble, dValue);
        env->SetObjectField(PropertyDoubleObj, fidNumber, DoubleObject);
        env->DeleteLocalRef(DoubleObject);
    }
    else
    {
        jclass DoubleCls = (env)->GetObjectClass(DoubleObject);
        jfieldID fidNumber_double = (env)->GetFieldID(DoubleCls, "value", "D");
        if (fidNumber_double == 0)
        {
            CreateException(env, "Failed to query value field from Double class.");
            return;
        }

        env->SetDoubleField(DoubleObject, fidNumber_double, dValue);
    }

}

以上所述是小编给大家介绍的如何设置的值��双重的�� JNI的类的类型变量?,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对77isp云服务器技术网的支持!

原文链接:https://77isp.com/post/25882.html

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

https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。