您的位置:首页 > 其它

JNI.h文件浅析

2016-07-19 21:04 211 查看
JNI.h文件浅析

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

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


JNI所支持的Java数据类型

jobject, jclass, jthrowable, jstring, jarray, jbooleanArray, jbyteArray, jcharArray, jshortArray, jintArray, jlongArray, 
jfloatArray, jdoubleArray, jobjectArray。这些都是原类型的指针。
对于C和C++的实现方式又有区别。对于C,上面的都是struct _jobject的指针。对于C++而言,上述类型存在如下的继承结构:



利用
typedef _jXXX *jXXX
转化为类型指针。


其它类型

jfieldID :域ID的指针类型。
jmethodID:方法ID的指针类型。
jvalue:union结构,用于保存基本类型的数据(具体有哪些请查询jni.h源码)。
上面三种类型的含义可以从《深入解析JVM虚拟机》中找到,主要是与.class文件相关的知识。
JNIEnv:保存JNI接口方法的数据结构。主要包含以下几种函数:Class相关的函数,反射相关的函数,异常处理函数,引用,初始化对象,获取field和method的ID,调用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怎么知道当前用的是哪个字段呢?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: