您现在的位置是:首页 > 数码 > 

JI学习笔记:JIEnv、jobject与jclass详解

2025-07-21 05:12:18
JI学习笔记:JIEnv、jobject与jclass详解 1 前言2 JIEnv指针 jobject与jclass类型 1 前言 在进行JI编程开发的时候,使用javah生成ative方法对应的ative函数声明,会发现所有的ative函数的第一个参数永远是JIEnv指针,而第二个参数永远是jobject或jcla

JI学习笔记:JIEnv、jobject与jclass详解


  • 1 前言
  • 2 JIEnv指针
  • jobject与jclass类型


1 前言

在进行JI编程开发的时候,使用javah生成ative方法对应的ative函数声明,会发现所有的ative函数的第一个参数永远是JIEnv指针,而第二个参数永远是jobject或jclass中的一个。JIEnv指针指代何物?具有何种功能?jobject和jclass又有何区别?
本文简单介绍了JI编程中JIEnvjobjectjclass这三种基本类型。

2 JIEnv指针

JIEnv,顾名思义,指代了Java本地接口环境(Java ative Interface Environment),是一个JI接口指针,指向了本地方法的一个函数表,该函数表中的每一个成员指向了一个JI函数,本地方法通过JI函数来访问JVM中的数据结构,详情如下图:

JIEnv指针在<jni.h>文件中的具体实现是一个包含诸多JI函数的结构体,在C语言中该结构体的名字定义为JIEnv_。局部摘要如下:

/** We use inlined functi for C so that programmers can write:**    env->FindClass(java/lang/String)** in C rather than:**    (*env)->FindClass(env, java/lang/String)** in C.*/struct JIEnv_ {ct struct JIativeInterface_ *functi;
#ifdef __cplusplusjint GetVersion() {return functi->GetVersion(this);}jclass DefineClass(ct char *name, jobject loader, ct jbyte *buf,jsize len) {return functi->DefineClass(this, name, loader, buf, len);}...jclass GetObjectClass(jobject obj) {return functi->GetObjectClass(this,obj);}jboolean IsInstanceOf(jobject obj, jclass clazz) {return functi->IsInstanceOf(this,obj,clazz);}jmethodID GetMethodID(jclass clazz, ct char *name,ct char *sig) {return functi->GetMethodID(this,clazz,name,sig);}...}

深入去看JIEnv结构体的话,不难发现,这个结构体当中包含了几乎有所的JI函数,大致可以分为如下几类:

函数名备注
ewObject创建Java类中的对象
ewString创建Java类中的String对象
ew<Type>Array创建类型为Type的数组对象
Get<Type>Field获取类型为Type的字段
Set<Type>Field设置类型为Type的字段的值
GetStatic<Type>Field获取类型为Type的static的字段
SetStatic<Type>Field设置类型为Type的static的字段的值
Call<Type>Method调用返回类型为Type的方法
CallStatic<Type>Method调用返回值类型为Type的static方法

jobject与jclass类型

jobjectjclass通常作为JI函数的第二个参数,当所声明ative方法是静态方法时,对应参数jclass,因为静态方法不依赖对象实例,而依赖于类,所以参数中传递的是一个jclass类型。相反,如果声明的ative方法时非静态方法时,那么对应参数是jobject
其在`<jni.h>``中的定义如下:

typedef _jobject *jobject;
typedef _jclass *jclass;
...
class _jobject {};
class _jclass : public _jobject {};
...

为了能够在ative层访问Java中的类和对象,jobjectjclass 分别指代了其所指代的类和对象,进而访问成员方法和成员变量等。但其实,我们一般使用javah指令直接生成ative函数的函数原型,故而不必纠结该使用哪种类型。

#感谢您对电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格的认可,转载请说明来源于"电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格

本文地址:http://www.dnpztj.cn/shuma/845684.html

相关标签:无
上传时间: 2024-02-05 13:07:35
留言与评论(共有 10 条评论)
本站网友 北京尿毒症医院
5分钟前 发表
jobject与jclass详解 1 前言2 JIEnv指针 jobject与jclass类型 1 前言 在进行JI编程开发的时候,使用javah生成ative方法对应的ative函数声明,会发现所有的ative函数的第一个参数永远是JIEnv指针,而第二个参数永远是jobject或jclass中的一个
本站网友 天津华英教育
0秒前 发表
name
本站网友 rct
15分钟前 发表
** (*env)->FindClass(env
本站网友 北京哪家医院隆胸好
12分钟前 发表
jobject和jclass这三种基本类型
本站网友 于都信息
18分钟前 发表
obj);}jboolean IsInstanceOf(jobject obj
本站网友 五纵五横
25分钟前 发表
但其实,我们一般使用javah指令直接生成ative函数的函数原型,故而不必纠结该使用哪种类型
本站网友 produced
5分钟前 发表
相反,如果声明的ative方法时非静态方法时,那么对应参数是jobject
本站网友 nannan
13分钟前 发表
clazz
本站网友 枫泾二手房出售
15分钟前 发表
name