[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*); }
|