• 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
    ", i);
        printf("j : %d
    ", j);
        printf("k : %d
    ", k);
        printf("m : %d
    ", 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、

  • 相关阅读:
    效能分析
    四人小组项目--连连看的设计与实现
    每周工作量及进度统计(第三周)
    四则运算改进版
    词频统计改进版1
    SCRUM站立会议
    四则运算
    效能分析
    四人小组项目的需求和功能等描述
    通读构建之法
  • 原文地址:https://www.cnblogs.com/javaskill/p/5421387.html
Copyright © 2020-2023  润新知