JNI编程参考备忘----成员变量和方法

本文详细介绍了JNI中如何访问Java类的成员变量和方法,包括静态与实例变量,构造方法,以及局部、全局和弱全局引用的管理。此外,还涉及异常处理、Java虚拟机接口、线程管理和国际化支持等关键知识点。
摘要由CSDN通过智能技术生成

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. 通过调用GetFieldIDGetFieldID获得成员变量相应的ID实例。

2. 然后根据ID来获得对成员变量的引用。

3. 方法调用

   也包含实例方法的调用和类的方法调用。

步骤也是分为两步:

1. 通过调用GetMethodIDGetStaticMethodID获得方法ID

2. 通过ID调用CallVoidMethodCallStaticVoidMethod调用Java类的方法。

 

原型声明:

jmethodID GetStaticMethodID(JNIEnv *env, jclass clazz, const char *name, const char *sig);

<NativeType> Cal

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值