JNI/NDK入门指南之jobject和jclass

Android JNI/NDK入门指南目录

JNI/NDK入门指南之正确姿势了解JNI和NDK
JNI/NDK入门指南之JavaVM和JNIEnv
JNI/NDK入门指南之JNI数据类型,描述符详解
JNI/NDK入门指南之jobject和jclass
JNI/NDK入门指南之javah和javap的使用和集成
JNI/NDK入门指南之Eclipse集成NDK开发环境并使用
JNI/NDK入门指南之JNI动/静态注册全分析
JNI/NDK入门指南之JNI字符串处理
JNI/NDK入门指南之JNI访问数组
JNI/NDK入门指南之C/C++通过JNI访问Java实例属性和类静态属性
JNI/NDK入门指南之C/C++通过JNI访问Java实例方法和类静态方法
JNI/NDK入门指南之JNI异常处理
JNI/NDK入门指南之JNI多线程回调Java方法
JNI/NDK入门指南之正确姿势了解,使用,管理,缓存JNI引用
JNI/NDK入门指南之调用Java构造方法和父类实例方法
JNI/NDK入门指南之C/C++结构体和Java对象转换方式一
JNI/NDK入门指南之C/C++结构体和Java对象转换方式二

引言

  在前面的章节JNI/NDK开发指南之JavaVM和JNIEnv中,我们详细介绍了一番JavaVM和JNIEnv,那么今天的篇章里面分别介绍一番jobject和jclass两个概念。


一.细说jobject和jclass

在JNI开发中JNI,实例引用(jobject)和类引用(jclass)让人觉得很困惑,至少我刚开始学习的时候是这么样的。jobject与jclass通常作为JNI函数的第二个参数,也许你在看Android源码或者其它人的相关代码时,你可能会留意到为啥JNI的第二个参数为啥通常是变化的呢,有时候是jobject有时候是jclass呢?这个要看该JNI函数所对应的函数在Java类中的申明,当所声明Native方法是静态方法时,对应参数jclass,因为静态方法不依赖对象实例,而依赖于类,所以参数中传递的是一个jclass类型。相反,如果声明的Native方法时非静态方法时,那么对应参数是jobject 。

1.jobject和jclass在jni.h中的定义

#ifdef __cplusplus
/** Reference types, in C++*/
class _jobject {};
class _jclass : public _jobject {};
typedef _jobject*       jobject;
typedef _jclass*        jclass;
...
#else /* not __cplusplus */
typedef void*           jobject;
typedef jobject         jclass;...
#endif /* not __cplusplus */

定义比较简单就不一一细说了。

2.实例引用和类引用在JNI中函数体现

实例引用和java.lang.Object类或它的子类的实例对应。类引用与java.lang.Class实例对应,它代表着类的类型。一个操作如GetFieldID,需要参数jclass,是一个类操作,因为它从一个类中获得field的描述。与此相反,GetIntField需要参数jobject,这是一个实例操作,因为它从这个实例中获得这个field的值。在所有的JNI方法中jobject和实例操作的结合和jclass和类操作的结合保持一致。所以是很容易记住类操作与实例操作的不同的。上述所描述的可以在JNI中函数体现出下,如下:

 //下述函数都是类引用有关系,所以参数都是jclassjfieldID    (*GetFieldID)(JNIEnv*, jclass, const char*, const char*);jobject     (*CallStaticObjectMethod)(JNIEnv*, jclass, jmethodID, ...);jobject     (*GetStaticObjectField)(JNIEnv*, jclass, jfieldID);//下述函数都是和实例引用有关系,所以参数都是jobjectjobject     (*GetObjectField)(JNIEnv*, jobject, jfieldID);jobject     (*CallObjectMethod)(JNIEnv*, jobject, jmethodID, ...);object     (*GetObjectField)(JNIEnv*, jobject, jfieldID);

3.简单介绍静态方法和实例方法的区别:

静态方法与静态变量一样,属于类本身,而不属于那个类的一个对象。调用一个被定义为static的方法,可以通过在它前面加上这个类的名称,也可以像调用非静态方法一样通过类对象调用。
实例方法必须通过类的实例来使用。实例方法可以使用类的非静态成员,也可以使用类的静态成员。
类的静态方法,静态变量是在类装载的时候装载的。但是要特别注意,类的静态变量是该类的对象所共有的,即是所有对象共享变量。所以建议尽量少用静态变量。尽量在静态方法中使用内部变量。

其中static关键字即表示静态的。声明静态方法的语法如下:
<访问修饰符>static返回类型 方法名(参数列表)
{//方法体}

静态方法与实例方法唯一不同的,就是静态方法在返回类型前加static关键字。静态方法的调用有两种途径:
(1) 通过类的实例对象去调用
调用格式为: 对象名.方法名
(2) 通过类名直接调用
调用格式为: 类名::方法名

4.实际案例分析

通过前面的章节,我想读者朋友们一定对jobject和jclass有了清晰的认识了,下面我们以实际code举例说明。
Java端代码:

public class Jobject_Jclass {public native static void fun();//类方法public native void fun1();//实例方法
}

JNI端代码:
通过javah命令生成头文件,生成的头文件如下,注意这里的第二个参数,你会发现原来真的如此,诚不欺我啊。

/** Class:     com_xxx_api_binder_Jobject_Jclass* Method:    fun* Signature: ()V*/
JNIEXPORT void JNICALL Java_com_xxx_api_binder_Jobject_1Jclass_fun(JNIEnv *, jclass);/** Class:     com_xxx_api_binder_Jobject_Jclass* Method:    fun1* Signature: ()V*/
JNIEXPORT void JNICALL Java_com_xxx_api_binder_Jobject_1Jclass_fun1(JNIEnv *, jobject);

写在最后

好了,关于jobject和jclass到这里就要告一段落了。下面让我们再次总结一下关于jobject和jclass的区别:

  • 当Java中定义的native方法为静态方法时,则第二个参数为jclass,jclass代表native方法所属类的class本身
    • 当Java中定义的native方法为非静态方法时,则第二个参数为jobject,jobject代表native方法所属类的实例对象

最后留下一个问题,jclass和jobject可以相互转换吗,如果可以转换具体是通过什么方式呢?青山不改绿水长流,各位江湖见!

JNI/NDK入门指南之jobject和jclass相关推荐

  1. JNI/NDK开发指南(八)——调用构造方法和父类实例方法

    转载请注明出处:http://blog.csdn.net/xyang81/article/details/44002089 在第6章我们学习到了在Native层如何调用Java静态方法和实例方法,其中 ...

  2. JNI NDK入门详解

    Android开发中,由于各种原因(跨平台,高性能,敏感数据处理等),这时候需要用到大家耳熟能详的JNI(Java Native Interface).本篇文章将带大家复习一下JNI中那些常用的知识点 ...

  3. JNI/NDK开发指南(三)——JNI数据类型及与Java数据类型的映射关系

    2019独角兽企业重金招聘Python工程师标准>>> 转载请注明出处:http://blog.csdn.net/xyang81/article/details/42047899 当 ...

  4. JNI/NDK开发指南(二)——JVM查找java native方法的规则

    转载请注明出处:http://blog.csdn.net/xyang81/article/details/41854185 通过第一篇文章,大家明白了调用native方法之前,首先要调用System. ...

  5. android -------- NDK 入门指南

    NDK介绍 原生开发工具包 (NDK) 是一组可让您在 Android 应用中利用 C 和 C++ 代码的工具. 可用以从您自己的源代码构建,或者利用现有的预构建库. NDK 不适用于大多数初学的 A ...

  6. JNI/NDK开发指南(十一)——JNI异常处理

    转载请注明出处:http://blog.csdn.net/xyang81/article/details/45770551 异常简介 异常,显而意见就是程序在运行期间没有按照正常的程序逻辑执行,在执行 ...

  7. JNI学习笔记:JNIEnv、jobject与jclass详解

    1 前言 2 JNIEnv指针 3 jobject与jclass类型 1 前言 在进行JNI编程开发的时候,使用javah生成Native方法对应的Native函数声明,会发现所有的Native函数的 ...

  8. jni java共享变量_JNI/NDK开发指南(七)——C/C++访问Java实例变量和静态变量 .

    在上一章中我们学习到了如何在本地代码中访问任意Java类中的静态方法和实例方法,本章我们也通过一个示例来学习Java中的实例变量和静态变量,在本地代码中如何来访问和修改.静态变量也称为类变量(属性), ...

  9. Android JNI开发入门之二

    在上一篇文章<Android JNI开发入门之一>中,我介绍了Android应用程序(APK)怎样通过JNI调用Native C实现的共享库.本文将进一步介绍Android应用程序通过JN ...

最新文章

  1. java里面有控制器吗_java怎么运行控制器里的类 java控制台输入类以及
  2. Qt安装及配置_很详细(附下载网址)
  3. 使用centos6.6部署Cobbler--自动安装centos系统
  4. Java中Date及Timestamp时间相关内容【转】
  5. 如何绑定多个action到一个slot
  6. Linux kernel 4.x中的min和max宏
  7. selenium page_source跟手动打开的不一样_爬虫界又出神器|一款比selenium更高效的利器...
  8. 学习笔记之七_第2层交换和生成树协议(STP)(CCNA知识考点)
  9. pandas读取csv文件数据并使用matplotlib画折线图和饼图
  10. flv 视频 文件 下载
  11. php数据库单循环显示,单循环赛制的PHP实现
  12. 多媒体系统导论 实验一:基于Photoshop的图像处理
  13. 五大赛场十大赛题百万奖金!山东省第二届数据应用创新创业大赛等你来!
  14. 群、环、域的概念,定义和理解.
  15. 超人前传第一至十季/全集Smallville迅雷下载
  16. 【系统维护篇】 之 从零开始
  17. Java 中如何过滤 Excel 文件
  18. 帝国cms php序号,帝国cms输出数字排序序号的列表
  19. 无盘服务器要开ahci,开启硬盘的ahci模式提升磁盘性能教程
  20. 带你辨析最小生成树的两种算法

热门文章

  1. python安装后在哪里找_python安装库后的文件在哪里?
  2. python sched_Python标准库之sched模块介绍
  3. SCHED_OTHER/SCHED_FIFO/SCHED_RR
  4. regex和集合(collection)
  5. 机器学习-白板推导系列(三十)-生成模型(Generative Model)
  6. CocosCreator之KUOKUO趣味文章:小怪的诞生 1
  7. linux中sz命令怎么使用,Linux 下sz/rz(lsz/lrz)的使用
  8. 如何解决回调地狱问题
  9. 新变化新营销 这些知识点你得 Get!(文末有 PPT 福利首次放送)
  10. Springboot毕设项目剧本杀桌游收银系统l6288(java+VUE+Mybatis+Maven+Mysql)