gpt4 book ai didi

java - JNI 访问对象的实例变量

转载 作者:太空狗 更新时间:2023-10-29 20:03:55 25 4
gpt4 key购买 nike

我正在尝试在 Java 上写入一个实例对象变量:

public class Test {
public Test () {
System.load("path_lib");
this.jni_result = 0;
}

public PrintVar() {
JniTest();
System.out.println("jni_result: " + Long.toString(this.jni_result));
}

private native long JniTest();
private long jni_result;
}

在 C 代码中,我创建了写入变量的函数

static void
SetErrorVariable(JNIEnv *env, jobject jobj, long error) {
/* Get a reference to jctf object's class */
jclass TestClass = env->GetObjectClass(jobj);

/* Get the Field ID of the instance variables "jni_result" */
jfieldID fidError = env->GetFieldID(TestClass, "jni_result", "J");

/* Change the variable "jni_result" */
jlong jerror = (jlong) error;
env->SetLongField(TestClass, fidError, jerror);
}

JNIEXPORT jlong JNICALL
Java_Test_JniTest(JNIEnv *env, jobject jobj) {
SetErrorVariable(env, jobj, -5)

return (jlong) -5;
}

当我在 C 代码中更改返回值时,我可以读取 JniTest 的返回值,但我无法更改变量,我阅读了几个 JNI 教程,但我没有找到其他方法来做到这一点,我错在哪里了?

最佳答案

要获取fieldID,你需要传递类,这就是你在这里所做的:

jfieldID fidError = env->GetFieldID(TestClass, "jni_result", "J");

要设置类的一个实例的字段,你需要传递那个类的实例,否则它怎么知道在哪个类的实例上设置值呢? TestClass是类,obj是类的实例。你正在通过 TestClass。所以改变这个:

env->SetLongField(TestClass, fidError, jerror);

对此:

env->SetLongField(obj, fidError, jerror);

关于java - JNI 访问对象的实例变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24206725/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com