内容发布更新时间 : 2025/6/10 14:59:58星期一 下面是文章的全部内容请认真阅读。
/* Access the static field si */
si = (*env)->GetStaticIntField(env, cls, fid); printf(\ (*env)->SetStaticIntField(env, cls, fid, 200); }
运行程序可得到输出结果:
In C:
StaticFieldAccess.si = 100 In Java:
StaticFieldAccess.si = 200
访问静态字段和对象实例字段的不同点:
1、 访问静态字段使用GetStaticFieldID,而访问对象的实例字段使用
GetFieldID,但是,这两个方法都有相同的返回值类型:jfieldID。
4.2 调用方法
JAVA中有几种不同类型的方法,实例方法必须在一个类的某个对象实例上面调用。而静态方法可以在任何一个对象实例上调用。对于构建方法的调用我们推迟到下一节。
JNI支持一系列完整的函数让你可以在本地代码中回调JAVA方法,下面例子演示了如何从本地代码中调用一个JAVA中的实例方法:
class InstanceMethodCall {
private native void nativeMethod(); private void callback() {
System.out.println(\ }
public static void main(String args[]) {
InstanceMethodCall c = new InstanceMethodCall(); c.nativeMethod(); }
static {
System.loadLibrary(\ } }
下面的是本地方法的实现:
JNIEXPORT void JNICALL
Java_InstanceMethodCall_nativeMethod(JNIEnv *env, jobject obj) {
jclass cls = (*env)->GetObjectClass(env, obj); jmethodID mid =
(*env)->GetMethodID(env, cls, \ if (mid == NULL) {
return; /* method not found */ }
printf(\
(*env)->CallVoidMethod(env, obj, mid); }
运行程序,得到如下输出:
In C
In Java
4.2.1 调用实例方法
本地方法Java_InstanceMethodCall_nativeMethod的实现演示了在本地代码中调用JAVA方法的两步:
1、 本地方法首先调用JNI函数GetMethodID。这个函数在指定的类中寻找相应的方法。这个寻找过程是基于方法描述符的。如果方法不存在,GetMethodID返回NULL。这时,立即从本地方法中返回,并引发一个NoSuchMethodError错误。
2、 本地方法通过调用CallVoidMethod来调用返回值为void的实例方法。
除了CallVoidMethod这个函数以外,J