如何通过 JNI 设置 Double/Integer 类型的 java class 的值
How to set the value of a Double/Integer type of a java class by JNI
早些时候,我问了一个问题:
但是,我没有得到我想要的正确答案。
假设我有一个 java class 像:
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
我真的不知道
如何处理class中的Double/Integer类型,看似和String类型一样,但又不同于String类型。好像jobject可以处理这样的类型,但是结果让我很困惑。
谢谢。
我不想使用像double/int这样的原始类型来达到我的目的,我也不想使用函数。或者你可以告诉我,我希望的方式不可能达到我的目标。非常感谢~~
首先,当您从 Data
实例获取 value
字段时,它没有被初始化,正如您的 java 代码所示,因此需要创建一个实例。
其次,你不能改变整数值,你必须用你想要的值实例化它。因此,创建一个新的 Integer,然后从 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;
}
早些时候,我问了一个问题:
但是,我没有得到我想要的正确答案。 假设我有一个 java class 像:
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
我真的不知道
如何处理class中的Double/Integer类型,看似和String类型一样,但又不同于String类型。好像jobject可以处理这样的类型,但是结果让我很困惑。
谢谢。
我不想使用像double/int这样的原始类型来达到我的目的,我也不想使用函数。或者你可以告诉我,我希望的方式不可能达到我的目标。非常感谢~~
首先,当您从 Data
实例获取 value
字段时,它没有被初始化,正如您的 java 代码所示,因此需要创建一个实例。
其次,你不能改变整数值,你必须用你想要的值实例化它。因此,创建一个新的 Integer,然后从 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;
}