JNI调用机制
JNI第一篇
此文是JNI的第二篇博客,我在之前的博客里写过如何实现一个基本的JNI,这篇文章是上一篇的升级版,详细解释了各种参数和实现方式,所以,在阅读此文前,请先看下如何实现一个基本的JNI调用,点击跳转
JNI:Java Native Interface是java本地接口。所谓的native,这里指C/C++写的底层接口。
一般在java层调用C层有这样的需求:
调用驱动,由于操作系统所提供的驱动一般都是C接口,Java语言本身不具备操作这些驱动的能力。
对于某些模块,Java的效率可能远低于C,因为,这些模块需要用C去完成。
对于某些功能模块,C层已经存在封装好的C代码,不想重复造轮子。
总之,基于某些原因,我们需要使用C代码。
Java访问C
Java中可以定义某个函数为native类型,对于native函数,只需要声明即可,因为该函数实现是native的,由相应的c去实现,Java编译器遇到native函数是,不会关心该函数的具体实现,因此,编译上不会出任何差错。
关于native函数的命名规则,看一下下面两个方法:
假设我们是在Framework层中的AssetManager中调用的,
java层方法
private native final void init();
C中对应方法
static void android_content_AssetManager_init(JNIEnv* env, jobject clazz);
这种映射关系就是一种编程规范,C中方法名对应的是Java层的包名+方法名,方法中第一个参数env是一个指向java虚拟机运行环境,