如何通过JNI设置我的Class的“Double”类型变量的值?

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

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

这些代码有效。

但是,当我试图通过JNI设置一个类的“Double”变量的值时,我无法得到我想要的东西,当然,它崩溃了,这让我有点困惑。

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’的值,’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, "", "(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; } 

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

您的C代码假定TestDouble.value是一个原始的double而不是Object Double ,因此在运行时失败。

您可以将类定义更改为

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