1. 对象成员变量的访问
函数原型:
jfieldID GetFieldID(JNIEnv *env, jclass clazz, const char *name, const char *sig);
代码实例:
JNIEXPORT void JNICALL Java_com_fyj_test_InstanceFieldAccess_accessField
(JNIEnv *env, jobject obj)
{
jfieldID fid; /* store the field ID */
jstring jstr;
const char *str;
/* get a reference to obj's class */
jclass cls = (*env)->GetObjectClass(env, obj);
printf("In C:\n");
/* look for the instance field s in cls */
fid = (*env)->GetFieldID(env, cls, "s", "Ljava/lang/String;");
if (fid == NULL)
return;
/* Read the instance fields s */
jstr = (*env)->GetObjectField(env, obj, fid);
str = (*env)->GetStringUTFChars(env, jstr, NULL);
if (str == NULL)
return;
printf(" s = \"%s\"\n", str);
(*env)->ReleaseStringUTFChars(env, jstr, str);
/* create a new string and overwrite the instance field */
jstr = (*env)->NewStringUTF(env, "123");
if (jstr == NULL)
return;
(*env)->SetObjectField(env, obj, fid, jstr);
}
1. 类成员变量的访问
函数原型
jfieldID GetStaticFieldID(JNIEnv *env, jclass clazz, const char *name, const char *sig);
代码示例:
JNIEXPORT void JNICALL Java_com_fyj_test_StaticFieldAccess_accessField
(JNIEnv *env, jobject obj)
{
jfieldID fid;
jint si;
jclass cls = env->GetObjectClass(obj);
cout<<"In C++:\n";
fid = env->GetStaticFieldID(cls, "si", "I");
if (fid == NULL)
return;
si = env->GetStaticIntField(cls, fid);
cout<<" StaticFieldAccess.si = "<<si<<endl;
env->SetStaticIntField(cls, fid, 200);
}
通过上述例子可知,在JNI层访问Java类的成员变量分为两步:
1. 通过调用GetFieldID或GetFieldID获得成员变量相应的ID实例。
2. 然后根据ID来获得对成员变量的引用。
3. 方法调用
也包含实例方法的调用和类的方法调用。
步骤也是分为两步:
1. 通过调用GetMethodID或GetStaticMethodID获得方法ID。
2. 通过ID调用CallVoidMethod或CallStaticVoidMethod调用Java类的方法。
原型声明:
jmethodID GetStaticMethodID(JNIEnv *env, jclass clazz, const char *name, const char *sig);
<NativeType> Cal