从 JNI 修改 Java 对象字段

Modify Java object field from JNI

我想在 java (android) 中声明一个 int a = 5 并使用 ndk 和 c/c++ 修改它,并在 jni 中更改 int a 的值,基本上它访问声明了变量的 ram 段,但我不知道该怎么做?

public class dataclass {                                                                
int a = 5;                                                                          
int b = 5;                                                                          
                                                                                    
static {                                                                            
    System.loadLibrary("native-lib");                                               
}                                                                                   
public native void changeValue(dataclass mclass);                                 

}

假设您在 Java 中将 changeValue 声明为 static 函数,您的本机代码将接收三个参数:一个 JNIEnv * env、一个 jclass cls , 和 jobject obj。后者是你要操作的dataclass实例

那么方法就是标准的:

  1. 使用 env->FindClass("dataclass")env->GetObjectClass(obj)
  2. 获取对 dataclass class 的引用
  3. 使用该引用获取要使用 env->GetFieldID(dataClass, "a", "I") 修改的字段的句柄。这里的 I 是与 int 关联的原始类型。
  4. 最后,调用 env->SetIntField(obj, fieldId, new_value)
  5. 进行更改