jni.h 头文件分析 3. 其它数据结构

文章目录


属性ID、方法ID 结构体

//java 属性 ID 结构体
struct _jfieldID;                       /* opaque structure 不透明,即未在本头文件中具体实现 */
typedef struct _jfieldID* jfieldID;     /* field IDs */

//java 方法 ID 结构体
struct _jmethodID;                      /* opaque structure 不透明,即未在本头文件中具体实现  */
typedef struct _jmethodID* jmethodID;   /* method IDs */


本地接口中的字段描述符

/*
 * JavaNative Interface FieldDescriptors  
 * 
 * jvalue 用 union 声明,jvalue 可以表示 java 中的所有数据类型
 *
 * 用于jni.h下的 JNIEnv 中 以大写 ·MethodA· 结尾的一些函数中,用于表示参数字段的类型
 */
typedef union jvalue {
    jboolean    z;
    jbyte       b;
    jchar       c;
    jshort      s;
    jint        i;
    jlong       j;
    jfloat      f;
    jdouble     d;
    jobject     l;
} jvalue;

jni 内存管理中的引用类型

/*
 * jni 引用类型, 用于管理 jni 环境中的内存
 *  Local Reference 只在 native method 执行时存在,当 native method 执行完后自动失效,
 *    所以它的释放可以不严格遵守
 *  JNIGlobalRefType 全局引用,在 gc 执行时,它不会主动回收,需要手动释放,即调用 deleteGlobalRef
 * 			 全局引用,释放不当,会造成内存泄露
 *  WeakGlobalRefType 弱全书面引用,使用上与全局的一样,只是它会在 gc 时,被回收;使用时要判断
 * 								weakObj==NULL
 */
typedef enum jobjectRefType {
    JNIInvalidRefType = 0,
    JNILocalRefType = 1,
    JNIGlobalRefType = 2,
    JNIWeakGlobalRefType = 3
} jobjectRefType;

本地方法结构体

typedef struct {
    const char* name;
    const char* signature; //方法签名,即 javap 命令看到的 
    void*       fnPtr;
} JNINativeMethod;  //本地方法 结构体

JNIEnv 和 JavaVM

对于 c 和 c++有不同的结构体定义;最后通过 typedef 重命名为: JNIEnv、JavaVM


struct JNIInvokeInterface; //此处声明jni 调用接口的结构体;内部定义了各种jvm 相关操作函数

struct _JNIEnv; //c++: _JNIEnv 与 JNINativeInterface 实现类似
struct _JavaVM; //c++: _JavaVM 与 JNIInvokeInterface 实现类似
typedef const struct JNINativeInterface* C_JNIEnv;

#if defined(__cplusplus) //c++
typedef _JNIEnv JNIEnv; 
typedef _JavaVM JavaVM; 
#else //c
typedef const struct JNINativeInterface* JNIEnv;
typedef const struct  JNIInvokeInterface* JavaVM;
#endif

c++中,JNIEnv、JavaVM 都是指代一个 struct;
c++,结构体内的函数使用了 this 指针,指代 JNIEnv、JavaVM的指针;
综上,在 jni 函数内 可: env->method(args…)
.
c 中, 是指代(JNINativeInterface *和JNIInvokeInterface *) 指针类型;
结构体函数内,需要传递 JNIEnv或JavaVM 变量;
该变量就相当于 JNINativeInterface 或 JNIInvokeInterface的二级指针
综上,在 jni 函数内 可: (*env)->method(env, args…)


上一篇:Jni 线程JNIEnv,JavaVM,JNI_OnLoad(GetEnv返回NULL?FindClass返回NULL?)


下一篇:Go 语言中,有时 nil 并不是一个 nil