• 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--进程通信--管道通信
    .NET开发中合理使用对象映射库,简化和提高工作效率
    信息科技如何做好风险管理
    2022.08.03_每日一题
    TPM分析笔记(七)Start-up相关命令字
    vue中使用h5 video标签实现弹窗播放本地视频
    IDEA写mybatis程序,java.io.IOException:Could not find resource mybatis-config.xml
    Go 单元测试之mock接口测试
    framework通信机制—LiveData使用方法及原理
    Photoshop 2023:重塑创意,引领数字艺术新纪元
  • 原文地址:https://www.cnblogs.com/luqman/p/Cjava.html