android jni ——Field Method -- Accessing Field

现在我们知道了怎样使用native code访问简单的数据类型和引用参考类型(string,array),下面我们来介绍怎样让jni代码去访问java中的成员变量和成员函数,然后可以再jni中回调java中的方法。

-------------------------------------------------------------------------------------

Accessing fields

java提供2中成员,静态成员和非静态成员,JNI支持了怎么样去get和set这些静态以及非静态成员的方法,下面来举一个例子。

先来访问非静态成员。

我们先在类中声明一个非静态的成员变量:

 

[java]  view plain copy
  1. public class MyJNI extends Activity {  
  2.     /** Called when the activity is first created. */  
  3.     //declear a instance field  
  4.     private String s="123";  


在点击按钮的时候我们把title的textview的字符串改成s,

 

 

[java]  view plain copy
  1. MyJNI mj = new MyJNI();  
  2.   
  3. mj.accessField();  
  4. tv.setText(mj.s);  


java代码很简单,只要实现我们的功能就好了,下面来看jni是如何进入class中的成员变量的:

 

 

[cpp]  view plain copy
  1. Java_com_android_jni_MyJNI_accessField(JNIEnv *env,jobject obj)  
  2. {  
  3.     jfieldID fid;  
  4.     jstring jstr;  
  5.     const char *str;  
  6.   
  7.     //get a reference to obj's class  
  8.     jclass cls = (*env)->GetObjectClass(env,obj);  
  9. //  jclass cls = (*env)->FindClass(env,"com/android/jni/Native");  
  10.     __android_log_print(ANDROID_LOG_INFO,"-JNI-","here in native C!");  
  11.     //look for the instance field in cls  
  12.     fid = (*env)->GetFieldID(env,cls,"s",  
  13.             "Ljava/lang/String;");  
  14.     if(fid == NULL){  
  15.         __android_log_print(ANDROID_LOG_INFO,"-JNI-","can not find field");  
  16.         return;  
  17.     }  
  18.     //read the instance field s  
  19.     jstr = (*env)->GetObjectField(env,obj,fid);  
  20.     str = (*env)->GetStringUTFChars(env,jstr,NULL);  
  21.     if(str == NULL)  
  22.         return;  
  23.     (*env)->ReleaseStringUTFChars(env,jstr,str);  
  24.     //create a new string and overwrite the instance field  
  25.     jstr = (*env)->NewStringUTF(env,"abc");  
  26.     if(jstr == NULL)  
  27.         return//out of memory  
  28.     (*env)->SetObjectField(env,obj,fid,jstr);  
  29. }  


为了访问目标类中的成员变量,要做2步,首先呼叫GetFieldID从类中来得到一个field ID,根据成员的名字和描述:

 

fid = (*env)->GetFieldID(env,cls,"s",
"Ljava/lang/String;");

然后根据这个field ID来访问这个成员:

jstr = (*env)->GetObjectField(env,obj,fid);

因为在java中string是对象,所以这边呼叫的是GetObjectField函数。

最后运行模拟器,点击按钮的时候textView会变成JNI中修改的“abc”



ok,这部分结束,下面来看如何访问静态成员变量。

同样的java代码中:

 

[java]  view plain copy
  1. public class MyJNI extends Activity {  
  2.     /** Called when the activity is first created. */  
  3.     //declear a instance field  
  4.     private static int si=100;  
  5.     private String s="123";  

 


我们定义一个静态的整形变量si初始化为100,当我们点击按钮的时候通过jni访问static field来改变si的值,然后再title的textView中显示出来。

 

[java]  view plain copy
  1. MyJNI mj = new MyJNI();  
  2.   
  3. mj.accessStaticField();  
  4. tv.setText(mj.si+"");  


我们来看下如何进入static field:

 

 

[cpp]  view plain copy
  1. void  
  2. Java_com_android_jni_MyJNI_accessStaticField(JNIEnv *env,jobject obj)  
  3. {  
  4.     jfieldID fid;   //store the field id  
  5.     jint si;  
  6.   
  7.     //get a reference to obj's class  
  8.     jclass cls = (*env)->GetObjectClass(env,obj);  
  9.     __android_log_print(ANDROID_LOG_INFO,"-JNI-","here in native C!");  
  10.       
  11.     //look for the static field si in lcs  
  12.     fid = (*env)->GetStaticFieldID(env,cls,"si","I");  
  13.     if(fid == NULL)  
  14.         return//field not found  
  15.     //access the static field si  
  16.     si = (*env)->GetStaticIntField(env,cls,fid);  
  17.     (*env)->SetStaticIntField(env,cls,fid,200);  
  18. }  


大家可以看到只是调用的方法不一样,多了一个static,和非静态的使用方法一样。

 

-------------------------------------------------------------------------------------------------------

jni中访问class 中的field就到此结束,下面一篇会介绍如何访问java中class 的method。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/265902.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

树状数组的建树 单点修改 单点查询 区间修改 区间查询

单点修改 单点查询 用普通数组就能写出来 单点修改 区间查询 用线段树 树状数组&#xff1b; 区间修改 区间查询 用线段树 树状数组&#xff1b; 区间修改 单点查询 用线段树 树状数组&#xff1b; 建树 #include<bits/stdc.h> using namespace std; …

bert 中文 代码 谷歌_如何用最强模型BERT做NLP迁移学习?

作者 | 台湾大学网红教授李宏毅的三名爱徒来源 | 井森堡&#xff0c;不定期更新机器学习技术文并附上质量佳且可读性高的代码。编辑 | Jane谷歌此前发布的NLP模型BERT&#xff0c;在知乎、Reddit上都引起了轰动。其模型效果极好&#xff0c;BERT论文的作者在论文里做的几个实验…

安装ubuntu20.04(安装vim、gcc、VMtools、中文输入法、汉化、修改IP、无法连网问题)

目录ubuntu安装包获取ubuntu的安装安装网络配置命令ifconfig连接网络(解决ubuntu无法连网问题)如何修改IP地址安装VMtools解决VMware Tools选项灰色VMtools安装安装中文&#xff0c;汉化添加中文输入法调整分辨率安装新版的Vim安装gccubuntu安装包获取 xunlei中直接搜索下载 …

arm-2014.05 编译三星内核错误 “not support ARM mode ‘smc 0’ ”

&#xff08;1&#xff09;arch/arm/mach-exynos/include/mach/smc.h文件&#xff1a; 在第54行和第69下面添加&#xff1a; __asm__ volatile (".arch_extension sec\n""smc 0\n": "r"(reg0), "r"(reg1), "r"(reg2), &…

从servlet中获取spring的WebApplicationContext

需要做一个参数初始化类&#xff0c;当web应用被加载时从数据库里取出相关的参数设置&#xff0c;并把这些参数放置到application里&#xff0c;jsp页面可以从中取出。1.在web.xml中配置&#xff1a; <servlet><servlet-name>Dispatcher</servlet-name><s…

python频率_Python中的频率分析

我试图使用Python来检索现场音频输入的主频率。目前&#xff0c;我正在试验使用音频流我的笔记本内置麦克风&#xff0c;但当测试以下代码时&#xff0c;我得到了非常差的结果。# Read from Mic Input and find the freqsimport pyaudioimport numpy as npimport bgeimport wav…

树莓派基于Linux内核驱动开发详解

目录一、驱动认知1.1 为什么要学习写驱动1.2 文件名与设备号1.3 open函数打通上层到底层硬件的详细过程二、基于框架编写驱动代码2.1 编写上层应用代码2.2 修改内核驱动框架代码2.3 部分代码解读2.3.1 static的作用2.3.2 结构体成员变量赋值方式2.3.3 结构体file_operations(最…

Spring AOP(三)--XML方式实现

本文介绍通过XML方式实现Spring AOP&#xff0c;在上一篇中已经介绍了通过注解&#xff0b;java配置的方式&#xff0c;这篇文章主要是看XML中怎么配置&#xff0c;直接上代码了&#xff1a; 一、创建一个连接点 1⃣️定义接口 注意⚠️&#xff1a;可以定义接口&#xff0c;也…

3.X内核下设备树–platform设备驱动

1。历史的车轮总是向前&#xff0c;技术更替。在linus 同学发出那句 WFK 后内核进入了设备树时代&#xff08;站在驱动工程师角度&#xff09;。 前几天我已经被mach-imx 中的文件折磨的夜不能眠。我终于在一个清晨&#xff0c;喝完一杯咖啡后决定放弃蹩脚的传统device描述方式…

六核cpu安装SQL Server 2005时报错,提示启动服务失败

2019独角兽企业重金招聘Python工程师标准>>> 新买的IBM3650M4的服务器上安装SQL server2005 安装到一半时&#xff0c;报"提示&#xff1a;SQL Server 服务无法启动。"错。 一开始以为是操作系统的问题&#xff0c;先重装了一遍&#xff0c;还是不行&…

postgis数据库优化_PostgreSQL批量导入性能优化

现在很多企业都将数据库逐渐由Mysql转向了更加强大而且开源的PostgreSQL数据库。在数据迁移过程中&#xff0c;PostgreSQL数据库导入大量数据时候非常缓慢&#xff0c;本文我们就来说说PostgreSQL数据库批量导入数据时的优化方法和策略。概述考虑PostgreSQL数据库批量导入数据时…

智能家居 (1) ——智能家居整体功能框架

目录 智能家居整体功能框架图硬件部分清单往期文章智能家居整体功能框架图 可作为大学生毕业设计内容,亦可作求职面试话术使用 使用的硬件平台:树莓派3B(型号),CortexA53(架构),博通BCM2837(芯片) 软件平台:Linux,内核版本3.14 本项目实现的功能是通过手机app、…

docker下交叉编译环境配置

为什么在docker中搭建开发环境&#xff1f; Docker 是一个开源的应用容器引擎&#xff0c;让开发者可以打包他们的应用以及依赖包到一个可移植的容器中&#xff0c;然后发布到任何流行的 Linux 机器上&#xff0c;也可以实现虚拟化。容器是完全使用沙箱机制&#xff0c;相互之…

jparepository查询所有_JPA – JpaRepository 中使用的查询方法

默认方法User usernew User();userRepository.findAll();userRepository.findOne(1l);userRepository.save(user);userRepository.delete(user);userRepository.count();userRepository.exists(1l);自定义查询User findByUserName(String userName);也使用一些加一些关键字And、…

Spring jdbc 对象Mapper的简单封装

一般查询实体的时候&#xff0c;都需要这么使用/** * 根据id查询 * * return */ public Emp queryEmpById(Integer id) { String sql "select * from emp where empno ?"; ParameterizedRowMapper<Emp> mappe…

网络编程知识预备(1) ——了解OSI网络模型

参考&#xff1a;简单了解OSI网络模型 作者&#xff1a;丶PURSUING 发布时间&#xff1a; 2021-03-18 20:07:09 网址&#xff1a;https://blog.csdn.net/weixin_44742824/article/details/114968802?spm1001.2014.3001.5502 根据需求摘抄自下面这篇文章&#xff0c;内容非常详…

完全内核移植–kernel3.15.3

目标平台 明远智睿 EK314 CPU I.MAX6Q内核版本 3.15.3编译器 arm-none-linux-gnueabi-gcc-4.8.3 1。下载纯净内核 2。配置Makefile 3。拷贝cp imx_v6_v7_defconfig .config 4。# make menuconfig 退出保存 5。#make zImage 进行第一次编译&#xff0c;看能否通过 6。修改…

antd表格显示分页怎么取消_真相!Word里怎么也删不掉的文档空白页原来是这样...

大家好&#xff0c;我是你们的海宝老师在Word里&#xff0c;经常会遇到这种情况&#xff1a;文档莫名其妙地多出一个或多个空白页&#xff0c;没啥内容却怎么也删不掉。不着急&#xff0c;咱们来一一分析。1、标题前的空白页像这种标题前面有空白&#xff0c;基本就是【段落】设…

ubuntu 搜狗安装搜狗输入法(fcitx)亲测有用

安装搜狗拼音输入法网上很多方法&#xff0c;总结了一下&#xff0c;下面的方法绝对可以&#xff0c;第一步&#xff1a;Ubuntu 默认是安装了ibus.所以删除它sudo apt-get remove ibus对于已经安装老版本的fcitx,删掉再装.sudo apt-get remove fcitx*删除依赖库sudo apt-get au…

网络编程知识预备(2) ——三次握手与四次挥手、流量控制(滑动窗口)、拥塞控制、半连接状态、2MSL

参考&#xff1a;浅显易懂的三次握手与四次挥手 作者&#xff1a;丶PURSUING 发布时间&#xff1a; 2021-03-19 09:33:20 网址&#xff1a;https://blog.csdn.net/weixin_44742824/article/details/114990198?spm1001.2014.3001.5502 参考&#xff1a;&#xff08;四十七&…