JNI访问对象的实例变量

Ale*_*lex 4 c c++ java java-native-interface

我正在尝试在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;
}
Run Code Online (Sandbox Code Playgroud)

在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;
}
Run Code Online (Sandbox Code Playgroud)

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

orf*_*orf 7

要获取fieldID,您需要传递类,这是您在此处所做的:

jfieldID fidError = env->GetFieldID(TestClass, "jni_result", "J");
Run Code Online (Sandbox Code Playgroud)

要设置类的实例的字段,您需要传递该类的实例,否则它如何知道要在其上设置值的类的实例?TestClass是类,obj是类的实例.你正在通过TestClass.所以改变这个:

env->SetLongField(TestClass, fidError, jerror);
Run Code Online (Sandbox Code Playgroud)

对此:

env->SetLongField(obj, fidError, jerror);
Run Code Online (Sandbox Code Playgroud)