• 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

  • 相关阅读:
    Spring AOP基础&动态代理&基于JDK动态代理实现
    FTTH语音故障总结
    Clang AST 学习(五):使用libclang (C Routine) 操作 AST
    代码随想录算法训练营第三十七天|738.单调递增的数字,968.监控二叉树
    ssm冬奥会志愿者报名系统毕业设计源码241154
    蓝牙配对连接详细解析
    前端:css中的多列的实现与介绍
    神经网络可以预测数据吗,如何用神经网络做预测
    【Linux网络】Linux网络设置
    SOLIDWORKS 2023交互设计新功能——协作处理团队数据 简化繁琐操作
  • 原文地址:https://www.cnblogs.com/luqman/p/Cjava.html