JNI(一) 认识JNI 上(jni.h里都有啥?)

来源:互联网 发布:天价域名排 编辑:程序博客网 时间:2024/05/16 06:33

今天,我们来了解一下 jni.h 这个头文件,大家都知道,要想在Java中调用C语言的方法,就离不开jni,写jni代码,必须导入jni.h这个头文件。

jni头文件里都有啥?

  1. 声明数据类型的映射关系
    这里写图片描述
    可以简单的理解为,Java里的boolean类型对应C语言里的unsigned char类型,
    在jni里有定义了一种可以直接访问的类型jboolean,以此类推。。。

  2. 继承关系
    这里写图片描述
    可以看出,大家都继承至_jobject{},一般的,除了之前定义的基本数据类型,其他的都是jobject 类型。

  3. 又定义了一波类型 (这个比较重要)
    这里写图片描述

    这里写图片描述

这里写图片描述

  1. 变量类型的签名(这个可以通过javap命令来查看方法的签名和参数的签名)
    这里写图片描述

  2. 定义类变量的引用类型()
    这里写图片描述

全局引用,弱引用之类的,都有各自不同的使用环境。比如说JNIGlobalRefType 很想Java里的成员变量

6.定义了method的结构体

这里写图片描述

method有三个属性name(方法名),signature(方法签名),fnptr(函数指针,指向native函数,和name属性一一对应)

  1. *env,在C和C++里实现是不一样的,写法也不相同(参考自)

    这里写图片描述

    这里写图片描述

    就是定义了JNIEnv ,它里边有很多函数指针,一个很简单的例子:
    jclass objclass = (*env)->FindClass();(C 语言)

    jclass objclass = env->FindClass();(C++ 语言)

  2. 跟java线程有关系的一些方法

    这里写图片描述

假如你有一个需求,你需要在native方法中开启一个线程,还要在java中接收该线程的回调,怎么做,就用到了这几个方法。(具体用法我会在下下篇中写个例子)

  1. 制定和获取jni的版本

    这里写图片描述

相当于get和set,可以在初始化jni的时候制定版本:比如
jint JNICALL JNI_OnLoad(JavaVM* vm, void* reserved){
return JNI_VERSION_1_4;
}

  1. 选择编译,如果是c++,就执行,从注释可以看出,这是初始化虚拟机时调用的

这里写图片描述

关于 extern “C“ 的用法和作用可参考

  1. 定义一些常量,异常

这里写图片描述

请关注我的后续介绍JNI(一) 认识JNI 中,JNI(一) 认识JNI 下