文章目录
属性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…)