2.5.2 操作成员变量(域)和方法
来源:互联网 发布:创意数据库设计 编辑:程序博客网 时间:2024/06/06 13:20
上节通过JNI提供的类操作函数得到了类的引用,通过这个引用便可以操作这个类上提供的方法和变量。JNI 用名字和类型签名来识别方法和域(变量)。
注意 Java中习惯将变量称为成员变量,而不是域。这里为了兼容JNI命名规则和Java习惯,将域和变量等价。
从名字和类型签名来操作对象上的域和方法可分为两步。还是以Log系统为例。打开android_util_Log.cpp,找到register_android_util_Log方法,代码如下: 首先,通过FindClass方法找到android/util/Log的类信息clazz;然后,以clazz为参数调用GetStaticFieldID(clazz, "DEBUG", "I"),其中DEBUG是要访问的Java域的名字,I是该Java域的类型签名,即整型。GetStaticFieldID的函数原型如下:
jfieldID GetStaticFieldID(jclass clazz, const char* name, const char* sig)
该函数返回了一个jfieldID,代表Java成员变量。最后将该jfieldID传给GetStaticIntField方法,得到Java层的成员变量DEBUG的值,即3。
下面是Log.java的源码: JNI调用Java层的方法与此类似,流程是:
FindClass->GetMethodID返回(jmethodID)->Call<Type>Method
这里仅提供函数列表,不再详细解释。
表2-4中列出了JNI提供的操作域和方法的函数。
注意 Java中习惯将变量称为成员变量,而不是域。这里为了兼容JNI命名规则和Java习惯,将域和变量等价。
从名字和类型签名来操作对象上的域和方法可分为两步。还是以Log系统为例。打开android_util_Log.cpp,找到register_android_util_Log方法,代码如下: 首先,通过FindClass方法找到android/util/Log的类信息clazz;然后,以clazz为参数调用GetStaticFieldID(clazz, "DEBUG", "I"),其中DEBUG是要访问的Java域的名字,I是该Java域的类型签名,即整型。GetStaticFieldID的函数原型如下:
jfieldID GetStaticFieldID(jclass clazz, const char* name, const char* sig)
该函数返回了一个jfieldID,代表Java成员变量。最后将该jfieldID传给GetStaticIntField方法,得到Java层的成员变量DEBUG的值,即3。
下面是Log.java的源码: JNI调用Java层的方法与此类似,流程是:
FindClass->GetMethodID返回(jmethodID)->Call<Type>Method
这里仅提供函数列表,不再详细解释。
表2-4中列出了JNI提供的操作域和方法的函数。
- 2.5.2 操作成员变量(域)和方法
- 反射(成员方法和成员变量)
- 成员变量和方法变量
- php访问成员变量和成员方法
- Java成员变量和成员方法
- Java成员变量和成员方法
- 静态方法和成员变量
- 使用java反射操作类的构造函数,成员变量和成员方法
- Java利用反射操作成员变量,方法
- Javascript类成员变量和方法作用域
- 数据结构:(更新中)成员变量、成员函数和实例一般命名和定义方法
- #500-2 成员变量和成员函数
- 【读书笔记】成员变量和局部变量(2)
- Java使用super操作被隐藏的成员变量和方法
- 继承中的成员方法和变量
- PHP 静态变量、成员和方法
- php静态变量, 成员和方法
- java中的成员变量和方法
- shell实用编程技巧
- JScrollPane实现自动滚动到底部
- asp.net正则表达式提取网页网址、标题、图片实例以及过滤所有HTML标签实例
- 观察者模式
- 使用CSS绘制三角形
- 2.5.2 操作成员变量(域)和方法
- 阿里巴巴2010校园招聘技术类笔试试题
- 《数据结构与算法——C语言实现》学习笔记——归并排序
- 上百个Android开源项目分享
- python调用shell
- 如何写出健壮的bash脚本
- ARM的启动代码(3):异常向量
- 识别不同种类的服务
- 桌面右下角弹广告窗