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的教程,但我没有找到其他方法来做到这一点,我在哪里做错了?
要获取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)