JNI.h文件浅析

JNI.h文件浅析

原创作品,允许转载,转载时请务必以超链接形式标明文章原始出处、作者信息和本声明。否则将追究法律责任。http://blog.csdn.net/taotaoyouarebaby/article/details/8751033

jni.h文件定义了JNIJava Native Interface)所支持的类型与接口。通过预编译命令可以支持CC++jni.h文件还依赖jni_md.h文件,jni_md.h文件定义了机器相关的jbyte, jintjlong对应的本地类型。

JNI所支持的Java数据类型

jobject, jclass, jthrowable, jstring, jarray, jbooleanArray, jbyteArray, jcharArray, jshortArray, jintArray, jlongArray, 

jfloatArray, jdoubleArray, jobjectArray。这些都是原类型的指针。

对于CC++的实现方式又有区别。对于C,上面的都是struct _jobject的指针。对于C++而言,上述类型存在如下的继承结构:


利用

typedef _jXXX *jXXX

转化为类型指针。

其它类型

jfieldID ID的指针类型。

jmethodID方法ID的指针类型。

jvalueunion结构,用于保存基本类型的数据(具体有哪些请查询jni.h源码)。

上面三种类型的含义可以从《深入解析JVM虚拟机》中找到,主要是与.class文件相关的知识。

JNIEnv保存JNI接口方法的数据结构。主要包含以下几种函数:Class相关的函数,反射相关的函数,异常处理函数,引用,初始化对象,获取fieldmethodID调用java方法的函数,获取/设置对象field的函数,字符串处理,数组的创建与销毁。

JavaVM保存与JVM相关的接口方法的数据结构。

JNICALL 函数调用方式:__stdcall

JNIEnv

以下代码只起说明作用,真实的实现是在一个文件中,所以实际代码还包含一些预编译技术(用于兼容C与C++),以及其它一些东西。

C实现方式:

typedef const struct JNINativeInterface_ *JNIEnv;

struct JNINativeInterface_ {

       jclass (JNICALL *FindClass)(JNIEnv *env, const char *name);

       //……

};

解释:

jclass (JNICALL *FindClass)(JNIEnv *env, const char *name);

函数指针FindClass,函数调用方式JNICALL,返回类型jclass,参数JNIEnv*const char*

调用方式

(*env)->FindClass(env, "java/lang/String")

C++实现方式:

typedef JNIEnv_ JNIEnv;

struct JNIEnv_ {

    const struct JNINativeInterface_ *functions;

    jclass FindClass(const char *name) {

        return functions->FindClass(this, name);

}

//……

};

调用方式

env->FindClass("java/lang/String")

可以注意到,在C实现中JNIEnv是指针类型,而在C++中是类。因此,才会有调用方式的不同。

JavaVM

JNIEnv类似

C实现方式:

typedef const struct JNIInvokeInterface_ *JavaVM;

struct JNIInvokeInterface_ {

jint (JNICALL *DestroyJavaVM)(JavaVM *vm);

//……

};

调用方式

(*jvm)->DestroyJavaVM(jvm);

C++实现方式:

typedef JavaVM_ JavaVM;

struct JavaVM_ {

    const struct JNIInvokeInterface_ *functions;

    jint DestroyJavaVM() {

        return functions->DestroyJavaVM(this);

    }

//……

};

调用方式

jvm->DestroyJavaVM();

附:


文件获取

对于jdk1.7.0 jdk目录\include\jni.h ;jdk目录\include\win32\jni_md.h。其它jdk版可以有一点差异,但应该都在include目录下。

问题:

对于jvalue怎么知道当前用的是哪个字段呢?

你可能感兴趣的:(jni)