一.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<jstring>(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,"<init>", "()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

ndk开发之native层访问java层的更多相关文章

  1. Android native进程间通信实例-binder篇之——HAL层访问JAVA层的服务

    有一天在群里聊天的时候,有人提出一个问题,怎样才能做到HAL层访问JAVA层的接口?刚好我不会,所以做了一点研究. 之前的文章末尾部分说过了service call 可以用来调试系统的binder服务 ...

  2. Android NDK开发之C调用Java及原生代码断点调试(二)

    上一篇中,我们主要学习了Java调用本地方法,并列举了两大特殊实例来例证我们的论据,还没学习的伙伴必须先去阅读下,本次的学习是直接在上一篇的基础上进行了.点击:Android NDK开发之从Java与 ...

  3. NDK开发小记录 C++读取java层对象内容

    这是自己NDK开发得小记录,关于C++层读取java层传来的对象内容. 很简单的一个例子, 1.首先在java层定义了一个类NumList: public class NumList { public ...

  4. Android NDK开发之从Java与C互调中详解JNI使用(一)

    生活 这一个礼拜过得真的是苦不堪言,上周因为打球脚踝直接扭伤,肿的想猪蹄一样,然后休息几天消肿了,可以缓慢龟速的行走了,然而五一回来上班第一天,上班鞋子还能穿上,下班脚已插不进鞋子里面了,好吧,又肿回 ...

  5. NDK开发之JNIEnv参数详解

    即使我们Java层的函数没有参数,原生方法还是自带了两个参数,其中第一个参数就是JNIEnv. 如下: native方法: public native String stringFromC(); pu ...

  6. Android NDK开发之Jni的数据类型

    在前面的一篇博客<Android NDK开发简介>,我简单地说明了Android NDK开发的流程,以及其重要的一环:JNI层得开发.今天我再详细说明一下自己的学习经验. JNI是Java ...

  7. Android NDK开发之Jni调用Java对象

    https://my.oschina.net/zhiweiofli/blog/114064 通过使用合适的JNI函数,你可以创建Java对象,get.set 静态(static)和 实例(instan ...

  8. NDK开发之javaVM

    1.关于JNIEnv和JavaVM JNIEnv是一个与线程相关的变量,不同线程的JNIEnv彼此独立.JavaVM是虚拟机在JNI层的代表,在一个虚拟机进程中只有一个JavaVM,因此该进程的所有线 ...

  9. Android NDK开发之Android.mk文件

    Android NDK开发指南---Android.mk文件 博客分类: Android NDK开发指南   Android.mk文件语法详述 介绍: ------------ 这篇文档是用来描述你的 ...

  10. NDK开发之ndk-build命令详解

    毫无疑问,通过执行ndk-build脚本启动android ndk构建系统. 默认情况下,ndk-build脚本在工程的主目录中执行,如: 我们可以用使用-C参数改变上述行为,-C指定工程的目录,这样 ...

随机推荐

  1. Python运维开发之路《函数》

    函数 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率.你已经知道Python提供了许多内建函数,比如print().但你也可以自己创建函 ...

  2. 【转载】老男孩读PCIe

    目录 老男孩读PCIe之一:从PCIe速度说起 老男孩读PCIe之二:PCIe拓扑结构 老男孩读PCIe之三:PCIe分层结构 老男孩读PCIe之四:TLP类型 老男孩读PCIe之五:TLP结构 老男 ...

  3. 《最新出炉》系列入门篇-Python+Playwright自动化测试-8-上下文(Context)

    1.简介 其实前边的文章中也提到过Context,只不过是 一笔带过,但是宏哥觉得在playwright中挺重要的,所以宏哥今天单独将其拎出来讲解和分享一下,希望对您有所帮助或者参考. 2.前言 Pl ...

  4. springboot下使用rabbitMQ之开发配置方式(一)

    springboot下使用rabbitMQ之开发配置方式(一) 距离上次发布博客已经小一年了,这次...嗯,没错,我又回来啦... 本次结合着B站某MQ视频以及最近在MQ上的实践聊一聊个人在使用rab ...

  5. Centos7下创建Oracle用户

    Centos7下创建Oracle用户 Oracle中,一个用户其实就类似于一个数据库,本次就来创建一个新用户 登录 将系统用户切换到oracle用户下 su - oracle -- 启动sqlplus ...

  6. GitHub搜索指令教程

    in:根据某个关键词来进行检索 关键词: name:项目名称 description:项目描述 readme:项目帮助文档 语法: 需要检索的内容:in:name或description或readme ...

  7. Spring-Bean实例化三种的方式

    Bean实例化三种方式 无参构造实例化(重点) 工厂静态方法实例化 工厂实例方法实例化 工厂静态方法实例化 1.编写接口 package com.my; public interface UserDa ...

  8. 好用的windows工具分享(20个)

    1.截图.画图全屏截图快捷键:printSreen窗口截图快捷键:alt+printSreen自定义截图工具:win+shift+s画图快捷键:cmd - mspaint可配合画图工具实现图片的编辑, ...

  9. Cobalt Strike 4.0系列教程

    https://blog.csdn.net/weixin_45745344/article/details/109279097

  10. RobotFrameWork环境搭建及使用

    RF环境搭建 首先安装python并且配置python环境变量 pip install robotframework pip install robotframework-ride 生产桌面快捷方式 ...