JNI_Z_04_属性的操作(非String类型的属性)

1、步骤 :

  (1)、获取 jclass

  (2)、获取 类属性字段的id(最后一个参数是 属性字段 的签名)

  (3)、获取/设置 类属性字段的值

 

  ZC: 貌似 JNI里面 操作 类属性字段,完全是 无视 访问权限的... 然而 static的类属性字段,稍有不同,要注意。

 

2、VC6(CPP)的DLL代码:

#include<stdio.h>
#include "jniZ_TjniField.h"

JNIEXPORT void JNICALL Java_jniZ_TjniField_NativeFunc(JNIEnv * env, jobject obj)
{
    // 获取obj中对象的class对象
    jclass clazz = env->GetObjectClass(obj);

    // 获取 类属性字段的id(最后一个参数是 属性字段 的签名)
    jfieldID fieldidFi = env->GetFieldID(clazz, "Fi", "I");            // public
    jfieldID fieldidFj = env->GetFieldID(clazz, "Fj", "I");            // protected
    jfieldID fieldidFk = env->GetFieldID(clazz, "Fk", "I");            // private
    jfieldID fieldidFm = env->GetStaticFieldID(clazz, "Fm", "I");    // (非public/protected/private)的static

    // 获取 类属性字段的值
    jint i = env->GetIntField(obj, fieldidFi);
    jint j = env->GetIntField(obj, fieldidFj);
    jint k = env->GetIntField(obj, fieldidFk);
    jint m = env->GetStaticIntField(clazz, fieldidFm);

    printf("i : %d\n", i);
    printf("j : %d\n", j);
    printf("k : %d\n", k);
    printf("m : %d\n", m);

    // 修改number的值为100,这里要注意的是jint对应C++是long型 ∴后面要加一个"L"
    env->SetIntField(obj, fieldidFi, 100 + i);
    env->SetIntField(obj, fieldidFj, 100 + j);
    env->SetIntField(obj, fieldidFk, 100 + k);
    env->SetStaticIntField(clazz, fieldidFm, 100 + m);
}

 

3、Java代码:

package jniZ;

import java.lang.reflect.Field;

public class TjniField
{
    public int Fi = 0;
    protected int Fj = 1;
    private int Fk = 2;
    static int Fm = 3;
    
    public native void NativeFunc();
    
    public static void main(String[] args) throws Exception
    {
        //调用动态链接库  
        System.loadLibrary("JniField_VC6");  
        TjniField jniZ = new TjniField();  
        jniZ.NativeFunc();
        
        // (1)、i
        System.out.println("Java Fi : "+jniZ.Fi);
        // (2)、j
        Class<?> clazz = jniZ.getClass();
        Field fieldJ = clazz.getDeclaredField("Fj");
        fieldJ.setAccessible(true);
        int j = fieldJ.getInt(jniZ);
        System.out.println("Java Fj : "+j);
        // (3)、k
        Field fieldK = clazz.getDeclaredField("Fk");
        fieldK.setAccessible(true);
        int k = fieldK.getInt(jniZ);
        System.out.println("Java Fk : "+k);
        // (4)、m
        System.out.println("Java Fm : "+Fm);
    }
}

 

4、Java控制台输出:

Java Fi : 100
Java Fj : 101
Java Fk : 102
Java Fm : 103
i : 0
j : 1
k : 2
m : 3

 

5、

 

posted @ 2016-04-22 15:10  JavaSkill  阅读(285)  评论(0)    收藏  举报