JNI.h文件浅析
来源:互联网 发布:速达 sqlserver未安装 编辑:程序博客网 时间:2024/06/06 03:15
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怎么知道当前用的是哪个字段呢?
- JNI.h文件浅析
- JNI.h文件浅析
- JNI.h文件浅析
- JNI:jni.h 头文件
- jni生成h文件
- jni.h文件解析
- jni.h文件
- JNI开发 api jni.h文件使用
- JNI 生成.h头文件
- android jni 生成 .h头文件
- Android JNI .h头文件生成说明
- jni.h头文件详解(一)
- jni.h头文件详解(二)
- jni.h头文件学习笔记
- 解决无法打开包含文件 “jni.h"
- JNI使用java生成*.h文件
- jni.h头文件详解(一)
- jni.h头文件详解(二)
- Linux VMnet Adapter无法启动的解决办法
- Number of Connected Components in an Undirected Graph 无向图中的连通区域的个数
- LinearLayout android:divider属性
- 基于XMPP协议的及时通讯
- Single Round Match 695
- JNI.h文件浅析
- 抖动文字
- 【C语言】浮点数的上溢下溢
- C#生成二维码名片
- 2016腾讯android面试题
- 安卓之自定义按钮(以及shape详解)
- [HDU]5726
- 二次剩余Cipolla算法学习小记
- 运用特征脸方法的基于Opencv的猫脸检测实现