如何通过 JNI 设置 java 类的双精度/整数类型的值
How to set the value of a Double/Integer type of a java class by JNI
早些时候,我问了一个问题:
如何通过 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;
}
相关文章:
- 为什么在传递长整型时调用具有两个双精度类型的参数的重载函数?
- if(双精度类型 == 字符类型)
- 为什么乘法与C++双精度类型值的加法一样快?
- 如何将双精度类型的鼠标移动 x 和 y 从主机传递到 Qemu 中的虚拟机
- 解释为什么 C++ 和 C# 对双精度类型具有不同的最大值?
- 由于C++中双精度类型的准确性而导致的错误
- 由将值分配给双精度类型的变量而导致的浮点异常
- 如何替换具有双精度类型的模板参数
- 在双精度类型数组中使用 memset()
- 如何将双精度类型转换为 DWORDLONG 或 DWORD 转换为 DWORDLONG 或 DWORD_PTR 转换为
- 无法将值赋给双精度类型
- 使用分数正确初始化双精度类型
- g++ abs()在短整型上似乎将其转换为双精度类型
- 常数表达式可以是双精度类型而不是只能是整型吗?
- 将c++双精度类型*转换为Java双精度类型
- 请求从"双精度"类型转换为非标量类型以及其他一些错误
- 无法从不区分大小写的字符串中提取双精度类型
- 如何将双精度类型转换为char*类型
- 复杂/双精度类型的运算符重载"+"
- 在c++中将包含二进制操作的字符串转换为双精度类型