一.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. 自己动手实现rpc框架(一) 实现点对点的rpc通信

    自己动手实现rpc框架(一) 实现点对点的rpc通信 1. 什么是rpc? RPC是远过程调用(Remote Procedure Call)的缩写形式,其区别于一个程序内部基本的过程调用(或者叫函数/ ...

  2. rocketmq-console基本使用

    rocketmq-console基本使用 作用:rocketmq-console是rocketmq的一款可视化工具,提供了mq的使用详情等功能. 一.安装部署 下载rocketmq组件 rocketm ...

  3. 国产开源流批统一的数据同步工具Chunjun入门实战

    @ 目录 概述 定义 特性 部署 安装 版本对应关系 通用配置详解 整体配置 Content 配置 Setting 配置 Local提交 Standalone提交 Json方式使用 SQL方式使用 M ...

  4. 了解O2OA(翱途)开发平台中的VIP应用

    使用O2OA(翱途)开发平台可以非常方便地进行项目的业务需求开发与实施,O2OA(翱途)开发平台并不限制实现的系统类型,所以能实现的系统很多,最终呈现的项目成果也是多样性的,可能是OA系统,可能是人力 ...

  5. 多app应用(推荐方式)

    多app应用目录结构 项目单独一个app结构: 多个app: 多个app放在一个apps文件夹中, 在根目录下创建apps的文件夹 操作: 没勾选template,那么项目根目录就没有template ...

  6. minipc安装与设置Ubuntu

    此文章是对刚刚在某宝买的minipc进行的Ubuntu server安装,以及部分应用过程 安装Ubuntu server22 参考一文搞懂Ubuntu Server 22.04.2安装 问题记录 开 ...

  7. Redis从入门到放弃(2):数据类型

    在Redis中,数据以键值对的形式存储.Redis支持五种主要的数据类型,每种类型都有不同的用途和特性. 本文将介绍Redis的五种数据类型:字符串(string),哈希(hash),列表(list) ...

  8. EF 管理数据库架构

    本章会主要了解EF提供的独立迁移项目,用独立迁移项目自动创建dgml设计关系图和sql脚本. 迁移项目通常也叫(CodeFirst代码优先),在EF中迁移项目是在,在代码中设计数据库,每次对数据库的设 ...

  9. python将两个列表组合成元组

    point_x = [A_x, B_x, C_x, D_x] point_y = [A_y, B_y, C_y, D_y] points_tulpe = list(zip(point_x, point ...

  10. Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-install-4_w0c665/PyQt5/

    错误: 解决方式:输入一下命令 1 pip3 install --upgrade setuptools 2 python3 -m pip install --upgrade pip 输入命令: 1 p ...