首页 > 编程知识 正文

朱格拉周期学习笔记,民法典学习笔记摘抄

时间:2023-05-04 18:09:10 阅读:237900 作者:3659

1 前言2 JNIEnv指针3 jobject与jclass类型

1 前言

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

2 JNIEnv指针

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

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

/* * We use inlined functions 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 JNIEnv_ { const struct JNINativeInterface_ *functions;#ifdef __cplusplus jint GetVersion() { return functions->GetVersion(this); } jclass DefineClass(const char *name, jobject loader, const jbyte *buf, jsize len) { return functions->DefineClass(this, name, loader, buf, len); } ... jclass GetObjectClass(jobject obj) { return functions->GetObjectClass(this,obj); } jboolean IsInstanceOf(jobject obj, jclass clazz) { return functions->IsInstanceOf(this,obj,clazz); } jmethodID GetMethodID(jclass clazz, const char *name, const char *sig) { return functions->GetMethodID(this,clazz,name,sig); } ... }

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

函数名备注NewObject创建Java类中的对象NewString创建Java类中的String对象New<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方法3 jobject与jclass类型

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

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

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

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。