从 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
实例
那么方法就是标准的:
- 使用
env->FindClass("dataclass")
或 env->GetObjectClass(obj)
获取对 dataclass
class 的引用
- 使用该引用获取要使用
env->GetFieldID(dataClass, "a", "I")
修改的字段的句柄。这里的 I
是与 int
关联的原始类型。
- 最后,调用
env->SetIntField(obj, fieldId, new_value)
进行更改
我想在 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
实例
那么方法就是标准的:
- 使用
env->FindClass("dataclass")
或env->GetObjectClass(obj)
获取对 - 使用该引用获取要使用
env->GetFieldID(dataClass, "a", "I")
修改的字段的句柄。这里的I
是与int
关联的原始类型。 - 最后,调用
env->SetIntField(obj, fieldId, new_value)
进行更改
dataclass
class 的引用