Android JNI开发(4)--访问Java的实例变量和静态变量

啥都不说了,上代码:

/* 
 * 访问Java实例变量的值
 */  
JNIEXPORT void accessInstanceField (JNIEnv *env, jclass cls, jobject obj)  
{  
    jclass clazz;  
    jfieldID fid;  
    jstring j_str;  
    jstring j_newStr;  
    const char *c_str = NULL;  

    // 1.获取AccessField类的Class引用  
    clazz = (*env)->GetObjectClass(env,obj);  
    if (clazz == NULL) {  
        return;  
    }  

    // 2. 获取AccessField类实例变量名为str的属性ID ,类型为String类型 
    fid = (*env)->GetFieldID(env,clazz,"str", "Ljava/lang/String;");  
    if (clazz == NULL) {  
        return;  
    }  

    // 3. 获取实例变量str的值  
    j_str = (jstring)(*env)->GetObjectField(env,obj,fid);  

    // 4. 将unicode编码的java字符串转换成C风格字符串  
    c_str = (*env)->GetStringUTFChars(env,j_str,NULL);  
    if (c_str == NULL) {  
        return;  
    }  
    printf("In C--->ClassField.str = %s\n", c_str);  
    (*env)->ReleaseStringUTFChars(env, j_str, c_str);  

    // 5. 修改实例变量str的值  
    j_newStr = (*env)->NewStringUTF(env, "This is C String");  
    if (j_newStr == NULL) {  
        return;  
    }  
    (*env)->SetObjectField(env, obj, fid, j_newStr);  

    // 6.删除局部引用  
    (*env)->DeleteLocalRef(env, clazz);  
    (*env)->DeleteLocalRef(env, j_str);  
    (*env)->DeleteLocalRef(env, j_newStr);  
}  

/* 
 * Class:     com_study_jnilearn_AccessField 
 * Method:    accessStaticField 
 * Signature: ()V 
 */  
JNIEXPORT void JNICALL Java_com_study_jnilearn_AccessField_accessStaticField  
(JNIEnv *env, jclass cls)  
{  
    jclass clazz;  
    jfieldID fid;  
    jint num;  

    //1.获取ClassField类的Class引用  
    clazz = (*env)->FindClass(env,"com/xxxx/ClassField");  
    if (clazz == NULL) {    // 错误处理  
        return;  
    }  

    //2.获取ClassField类静态变量num的属性ID  
    fid = (*env)->GetStaticFieldID(env, clazz, "num", "I");  
    if (fid == NULL) {  
        return;  
    }  

    // 3.获取静态变量num的值  
    num = (*env)->GetStaticIntField(env,clazz,fid);  
    printf("In C--->ClassField.num = %d\n", num);  

    // 4.修改静态变量num的值  
    (*env)->SetStaticIntField(env, clazz, fid, 80);  

    // 删除属部引用  
    (*env)->DeleteLocalRef(env,clazz);  
}  
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值