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对应的本地类型。
jobject, jclass, jthrowable, jstring, jarray, jbooleanArray, jbyteArray, jcharArray, jshortArray, jintArray, jlongArray,
jfloatArray, jdoubleArray, jobjectArray。这些都是原类型的指针。
对于C和C++的实现方式又有区别。对于C,上面的都是struct _jobject的指针。对于C++而言,上述类型存在如下的继承结构:
利用
转化为类型指针。
jfieldID :域ID的指针类型。
jmethodID:方法ID的指针类型。
jvalue:union结构,用于保存基本类型的数据(具体有哪些请查询jni.h源码)。
上面三种类型的含义可以从《深入解析JVM虚拟机》中找到,主要是与.class文件相关的知识。
JNIEnv:保存JNI接口方法的数据结构。主要包含以下几种函数:Class相关的函数,反射相关的函数,异常处理函数,引用,初始化对象,获取field和method的ID,调用java方法的函数,获取/设置对象field的函数,字符串处理,数组的创建与销毁。
JavaVM:保存与JVM相关的接口方法的数据结构。
JNICALL :函数调用方式:__stdcall
以下代码只起说明作用,真实的实现是在一个文件中,所以实际代码还包含一些预编译技术(用于兼容C与C++),以及其它一些东西。
C实现方式:
解释:
函数指针FindClass,函数调用方式JNICALL,返回类型jclass,参数JNIEnv*和const char*。
调用方式
C++实现方式:
调用方式
可以注意到,在C实现中JNIEnv是指针类型,而在C++中是类。因此,才会有调用方式的不同。
与JNIEnv类似
C实现方式:
调用方式
C++实现方式:
调用方式
对于jdk1.7.0 :jdk目录\include\jni.h ;jdk目录\include\win32\jni_md.h。其它jdk版可以有一点差异,但应该都在include目录下。
对于jvalue怎么知道当前用的是哪个字段呢?
原创作品,允许转载,转载时请务必以超链接形式标明文章原始出处、作者信息和本声明。否则将追究法律责任。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); |
调用方式
(*env)->FindClass(env, "java/lang/String") |
typedef JNIEnv_ JNIEnv; struct JNIEnv_ { const struct JNINativeInterface_ *functions; jclass FindClass(const char *name) { return functions->FindClass(this, name); } //…… }; |
env->FindClass("java/lang/String") |
JavaVM
与JNIEnv类似C实现方式:
typedef const struct JNIInvokeInterface_ *JavaVM; struct JNIInvokeInterface_ { jint (JNICALL *DestroyJavaVM)(JavaVM *vm); //…… }; |
(*jvm)->DestroyJavaVM(jvm); |
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怎么知道当前用的是哪个字段呢?
相关文章推荐
- 基于XMPP协议的及时通讯
- LinearLayout android:divider属性
- vtkActor在Render中移动的方法
- 人生第一场SRM SRM695 Div.2
- MFC显示图片
- 观察者模式I
- android studio jni.h 红色报错
- 基于粒子群算法的最小二乘支持向量机实现多分类(PSO_LSSVM)
- C#值类型和引用类型的深入理解
- C#值类型和引用类型的深入理解
- C#值类型和引用类型的深入理解
- C#值类型和引用类型的深入理解
- C#值类型和引用类型的深入理解
- C#值类型和引用类型的深入理解
- C#值类型和引用类型的深入理解
- C#值类型和引用类型的深入理解
- C#值类型和引用类型的深入理解
- C#值类型和引用类型的深入理解
- C#值类型和引用类型的深入理解
- C#值类型和引用类型的深入理解