• ndk开发之native层访问java层


    一.native层访问java层的成员变量

      java层的成员变量可以分为实例变量和静态变量,不过他们的访问方法比较类似,可以分为以下三步:

    1. 获取java类对应的jclass对象
    2. 获取需要访问的成员变量的jfieldID
    3. 根据需要访问的变量的类型,调用setXXXField()/getXXXField()方法来设置/获取成员变量的值

      示例代码如下:

    复制代码
    void native_accessNonStaticField(JNIEnv *env,jobject thiz){//访问实例变量
        jclass clazz=env->GetObjectClass(thiz);
        jfieldID id=env->GetFieldID(clazz,"age","I");
        //获取java层age的值
        jint age=env->GetIntField(thiz,id);
        //修改java层age的值
        env->SetIntField(thiz,id,10);
    }
    void native_accessStaticField(JNIEnv *env,jobject thiz){//访问静态变量
        jclass clazz=env->GetObjectClass(thiz);
        jfieldID id=env->GetStaticFieldID(clazz,"name","Ljava/lang/String;");
        //获取java层name的值
        jstring name= static_cast(env->GetStaticObjectField(clazz, id));
        //修改java层name的值
        const char *name1="jack";
        jstring name2=env->NewStringUTF(name1);
        env->SetStaticObjectField(clazz,id,name2);
    }
    复制代码

    二.native层访问java层的成员方法

      同样的java层的成员方法也分为实例方法和静态方法,它们的访问方式也很类似,可以分为以下三个步骤:

    1. 获取java类对应的jclass对象
    2. 获取需要访问的成员方法的jmethodID
    3. 接着就可以调用CallXXXMethod()/CallStaticXXXMethod()方法访问相应的方法

      示例代码如下:

    复制代码
    void native_accessNonStaticMethod(JNIEnv *env,jobject thiz){//访问实例方法
        jclass clazz=env->GetObjectClass(thiz);
        //实例化对象
        jmethodID constructor_method_id=env->GetMethodID(clazz,"", "()V");
        jobject Test=env->NewObject(clazz,constructor_method_id);
        //调用java层的方法
        const char *str="实例方法";
        jstring str1=env->NewStringUTF(str);
        jmethodID id=env->GetMethodID(clazz,"NonStaticMethod", "(Ljava/lang/String;)V");
        env->CallVoidMethod(Test,id,str1);
        //清理临时引用
        env->DeleteLocalRef(clazz);
        env->DeleteLocalRef(Test);
    }
    void native_accessStaticMethod(JNIEnv *env,jobject thiz){//访问静态方法
        jclass clazz=env->GetObjectClass(thiz);
        //调用java层的方法
        const char *str="静态方法";
        jstring str1=env->NewStringUTF(str);
        jmethodID id=env->GetStaticMethodID(clazz,"StaticMethod","(Ljava/lang/String;)V");
        env->CallStaticVoidMethod(clazz,id,str1);
        //清理临时引用
        env->DeleteLocalRef(clazz);
    }
    复制代码

     三.native层访问java层的一些常用jni方法

       如果要访问其他基本类型的变量或者函数的返回值为其他基本类型时,将Int改为其他基本类型即可。

     

    参考:https://juejin.cn/post/7244709476518510629

  • 相关阅读:
    图论-二分图
    Linux虚拟机和开发板scp命令互传文件
    vue简单下载
    Vue使用for循环加Promise.all来发送多个请求,并且等到所有请求结束后处理数据
    mysql 字符串截取
    书生·浦语大模型开源体系(七)作业
    桥梁模板人工费多少钱?
    【TA】OP-TEE demo学习
    国内优秀的多用户商城系统盘点(2022年整理)
    CSS之垂直水平居中的背后
  • 原文地址:https://www.cnblogs.com/luqman/p/Cjava.html