android jni ——Field & Method --> Accessing Field
现在我们知道了怎样使用native code访问简单的数据类型和引用参考类型(string,array),下面我们来介绍怎样让jni代码去访问java中的成员变量和成员函数,然后可以再jni中回调java中的方法。
-------------------------------------------------------------------------------------
Accessing fields
java提供2中成员,静态成员和非静态成员,JNI支持了怎么样去get和set这些静态以及非静态成员的方法,下面来举一个例子。
先来访问非静态成员。
我们先在类中声明一个非静态的成员变量:
- public class MyJNI extends Activity {
- /** Called when the activity is first created. */
- //declear a instance field
- private String s="123";
在点击按钮的时候我们把title的textview的字符串改成s,
- MyJNI mj = new MyJNI();
- mj.accessField();
- tv.setText(mj.s);
java代码很简单,只要实现我们的功能就好了,下面来看jni是如何进入class中的成员变量的:
- Java_com_android_jni_MyJNI_accessField(JNIEnv *env,jobject obj)
- {
- jfieldID fid;
- jstring jstr;
- const char *str;
- //get a reference to obj's class
- jclass cls = (*env)->GetObjectClass(env,obj);
- // jclass cls = (*env)->FindClass(env,"com/android/jni/Native");
- __android_log_print(ANDROID_LOG_INFO,"-JNI-","here in native C!");
- //look for the instance field in cls
- fid = (*env)->GetFieldID(env,cls,"s",
- "Ljava/lang/String;");
- if(fid == NULL){
- __android_log_print(ANDROID_LOG_INFO,"-JNI-","can not find field");
- return;
- }
- //read the instance field s
- jstr = (*env)->GetObjectField(env,obj,fid);
- str = (*env)->GetStringUTFChars(env,jstr,NULL);
- if(str == NULL)
- return;
- (*env)->ReleaseStringUTFChars(env,jstr,str);
- //create a new string and overwrite the instance field
- jstr = (*env)->NewStringUTF(env,"abc");
- if(jstr == NULL)
- return; //out of memory
- (*env)->SetObjectField(env,obj,fid,jstr);
- }
为了访问目标类中的成员变量,要做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代码中:
- public class MyJNI extends Activity {
- /** Called when the activity is first created. */
- //declear a instance field
- private static int si=100;
- private String s="123";
我们定义一个静态的整形变量si初始化为100,当我们点击按钮的时候通过jni访问static field来改变si的值,然后再title的textView中显示出来。
- MyJNI mj = new MyJNI();
- mj.accessStaticField();
- tv.setText(mj.si+"");
我们来看下如何进入static field:
- void
- Java_com_android_jni_MyJNI_accessStaticField(JNIEnv *env,jobject obj)
- {
- jfieldID fid; //store the field id
- jint si;
- //get a reference to obj's class
- jclass cls = (*env)->GetObjectClass(env,obj);
- __android_log_print(ANDROID_LOG_INFO,"-JNI-","here in native C!");
- //look for the static field si in lcs
- fid = (*env)->GetStaticFieldID(env,cls,"si","I");
- if(fid == NULL)
- return; //field not found
- //access the static field si
- si = (*env)->GetStaticIntField(env,cls,fid);
- (*env)->SetStaticIntField(env,cls,fid,200);
- }
大家可以看到只是调用的方法不一样,多了一个static,和非静态的使用方法一样。
-------------------------------------------------------------------------------------------------------
jni中访问class 中的field就到此结束,下面一篇会介绍如何访问java中class 的method。
android jni ——Field & Method --> Accessing Field的更多相关文章
- android jni (5)——Field & Method --> Accessing Mehtod
在java编程语言中有非静态成员函数和静态成员函数,JNI允许我们访问到java中的成员函数,然后再jni中调用,这里我就来举例说明在jni中是如何做到的. 我们先在java中定义2个成员函数,一个非 ...
- graphQL 启动报错No method or field found with any of the following signatures (with or without one of [interface graphql.schema.DataFetchingEnvironment] as the last argument), in priority order:
-------------------root.graphqls---------------------------这个文件用来定义属性字段,必须和实体类相同 文件里面的字段写错会报这个错误 com ...
- Constructor、Method、Field 源码阅读
AnnotatedElement /** * AnnotatedElement 接口表示目前正在此 VM 中运行的应用程序的一个已注解元素[类.方法.属性]. * 该接口允许反射性地读取注解.此接口中 ...
- NDK(5) Android JNI官方综合教程[JavaVM and JNIEnv,Threads ,jclass, jmethodID, and jfieldID,UTF-8 and UTF-16 Strings,Exceptions,Native Libraries等等]
JNI Tips In this document JavaVM and JNIEnv Threads jclass, jmethodID, and jfieldID Local and Global ...
- Android jni系统变量、函数、接口定义汇总
在做Android jni开发时,jni为我们提供了哪些函数.接口.变量,有时候一头雾水,今天就把jni.h中定义的所有内容列出来,供自己查阅: /* * Copyright (C) 2006 The ...
- 【转】android JNI
原文网址:http://jinguo.iteye.com/blog/696185 Java Native Interface (JNI)标准是java平台的一部分,它允许Java代码和其他语言写的代码 ...
- Android JNI学习(四)——JNI的常用方法的中文API
本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Nati ...
- Android JNI作用及其详解
Android JNI作用及其详解 Java Native Interface (JNI)标准是Java平台的一部分,它允许Java代码和其他语言写的代码进行交互.JNI 是本地编程接口,它使得在 J ...
- android JNI 资料大全
AndroidJNI 通过C++调用JAVA 1. JNIEnv对象 对于本地函数 JNIEXPORT void JNICALL Java_video1_TestNative_sayHel ...
随机推荐
- struts1配置文件之input
<action path="/*Person" type="cn.itcast.PersonAction" scope="request&quo ...
- hdu4055 dp
http://acm.hdu.edu.cn/showproblem.php?pid=4055 Problem Description The signature of a permutation is ...
- [RxJS] Reactive Programming - Using cached network data with RxJS -- withLatestFrom()
So now we want to replace one user when we click the 'x' button. To do that, we want: 1. Get the cac ...
- 深入浅出理解iOS经常使用的正則表達式—基础篇[Foundation]
參考资料:cocoachina的zys475481075的文章 几个单词 Regular ['regjʊlə]adj. 定期的:有规律的 Expression[ɪk'spreʃ(ə)n; ek-] n ...
- CSS元素 之 float
1. float 设计的初衷 Float 设计的初衷是为了文字环绕的效果 使得文字可以围绕着 图片.就像下面这样 2. float 的包裹和 破坏 A) 包裹性 和 破坏性 例如下图 我们原本是希 ...
- AIX 7.1 安装 Python2.7.5
一.下载必要的安装包 1. gdbm-1.8.3-5.aix5.2.ppc.rpm 下载地址:ftp://ftp.software.ibm.com/aix/freeSoftware/aixtoolb ...
- SQL Server常用脚本
一.迁移登录用户脚本: select 'create login [' + p.name + '] ' + case when p.type in('U','G') then 'from window ...
- 2.IKAnalyzer 中文分词器配置和使用
一.配置 IKAnalyzer 中文分词器配置,简单,超简单. IKAnalyzer 中文分词器下载,注意版本问题,貌似出现向下不兼容的问题,solr的客户端界面Logging会提示错误. 给出我配置 ...
- 《第一行代码》学习笔记17-碎片Fragment(2)
1.碎片的状态和回调: (1)运行状态:碎片可见+所关联的活动处于运行状态. (2)暂停状态:当活动进入暂停状态(由于另一个未占满屏幕的活动被添加到栈顶),与其相关联的可见碎片会进入暂停状态. (3) ...
- oracle to_char()及to_date()函数使用
to_char(x[,format]) :将x转换成字符串,可以使用format参数来格式化字符串输出. to_date(x[,format]) :将字符串x转换成日期,可以使用format匹配要转换 ...