[TOC]

文章参考:https://weread.qq.com/web/reader/a80325c0715a39b7a806749

概述

结构体JNIEnv

JNIEnv是代表JNI环境的结构体,定义如下:

1
2
3
4
5
6
7
8
9
10
struct _JNIEnv;
struct _JavaVM;
typedef const struct JNINativeInterface* C_JNIEnv;
#if defined(__cplusplus)
typedef _JNIEnv JNIEnv;
typedef _JavaVM JavaVM;
#else
typedef const struct JNINativeInterface* JNIEnv;
typedef const struct JNIInvokeInterface* JavaVM;
#endif

从代码看,JNI的定义还区分了C和C++。因为Android中已经定义了宏__cplusplus,所以这里可以只关注C++部分的代码。在C++部分,JNIEnv等同于结构_JNIEnv,下面是_JNIEnv的定义:

1
2
3
4
5
6
7
8
9
10
struct _JNIEnv {
const struct JNINativeInterface* functions;
#if defined(__cplusplus)
jint GetVersion() { return functions->GetVersion(this); }
jclass DefineClass(const char *name, jobject loader, const jbyte* buf, jsize bufLen)
{ return functions->DefineClass(this, name, loader, buf, bufLen); }
jclass FindClass(const char* name){ return functions->FindClass(this, name); }
......
#endif
}

结构体中的函数又调用了成员变量functions的函数,functions是指向结构体JNINative Interface的指针,JNINativeInterface的定义如下:

1
2
3
4
5
6
7
8
struct JNINativeInterface {
void* reserved0;
void* reserved1;
void* reserved2;
void* reserved3;
jint (*GetVersion)(JNIEnv *);
jclass (*DefineClass)(JNIEnv*, const char*, jobject, const jbyte*, jsize);
jclass (*FindClass)(JNIEnv*, const char*); }